2017-09-12 8 views
1

myfile.txtをログイン用のパスワードを使用するリモートSSHに送信するようにします。 OSX用のbashからPHP - PHPでパスワード付きのSSH経由でBASH OSXからリモートにSCPローカルファイルを送る方法

私は手動でファイルを送信するには、このコマンドを使用します。

#!/usr/bin/expect 
spawn scp /Users/myname/Documents/myfile.txt [email protected]:/Docs/myfile.txt 
expect "[email protected]'s password:" 
send "mYpassWORD\r" 
interact 

が、私はこれを実行することができます。

scp /Users/myname/Documents/myfile.txt [email protected]:/Docs/myfile.txt 

を私はPHPを経由して、それを実行する必要がありますので、私はこのupload.sh bashスクリプトを作りましたコードの上に:./update.sh端末で、それは私が望むようにファイルを送信します。

問題は、PHPでこのbashスクリプトを追加するときに、ファイルを送信しないことです。

exec('/Library/WebServer/update.sh 2>&1', $output); 
print_r($output); 

そして、私はこのエラー/ MSGで立ち往生しています:

私が試してみました、それはいけないPHPを経由して、

Array 
(
    [0] => spawn scp /Users/myname/Documents/myfile.txt [email protected]:/Docs/myfile.txt 
    [1] => [email protected]'s password: 
) 

はbashでパスワードが送信され、すべてがOKですが、ファイルをアップロード。 私はまた、初めてPHPにそれを実行したことに気付きました。それはSSHホストキーが一致しないと言いました。そのため、.sshフォルダをサーバルートの場所にコピーしました。そのエラーはなくなりました。

誰でも手助けをしていただけますか? ありがとうございました

+0

SSH鍵のペアを生成し、公開鍵をサーバの '〜/ .ssh/authorized_keys'ファイルに追加しようとしましたか?パスワードを入力する必要はなく、 'expect'も必要ありません。 –

+0

@RuslanOsmanov申し訳ありませんが、わかりません。ターミナル経由でログインしたときに、.sshに保存したいのかと尋ねられました。しかし、PHPを使用する場合、OwnerはWWWは別のアカウントを意味しますか? .sshフォルダをサーバにコピーしましたが、今は鍵を要求しません。私は 'authorized_keys'を生成していません。私には 'known_hosts'しかありません。どうやってやるの?ありがとう – Cyborg

+0

秘密鍵を誰にも渡すべきではありません(!)。ハンドシェイクは、公開鍵を使用して行われます。信頼できる公開鍵はサーバの '〜/ .ssh/authorized_keys'ファイルに登録されているはずであり、公開鍵はクライアントのマシンに保存する必要があります_only_。 'ssh-keygen'ユーティリティを使って一対のSSH鍵を生成することができます。たとえば、[GitHubの手順](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/)を参照してください。 –

答えて

0

期待どおりに働いていますが、解決策はありません。

解決方法が見つかりましたが、正常に動作しているかどうかはわかりません。 問題はパスワード関連ではありません。問題は/だった:Bashスクリプトがあまりにも高速です。あるいは、PHPが速すぎるかもしれませんか?

とにかくsend "mYpassWORD\r"の後にsleepを追加して問題を解決しました。 index.php私が書きました::update.sh。そして、PHPファイルにchmod +x update.sh

をした:私はこのように保存されて

#!/usr/bin/expect 
spawn scp /Library/WebServer/Documents/test34/myfile.txt [email protected]:/Docs/myfile.txt 
expect "[email protected]'s password:" 
send "mYpassWORD\r" 
sleep 0.2 
interact 

: は、ここで私はパスワードを使用してリモートにファイルを送信するためにPHPからアクセスし、私の作業bashコマンドである

<?php 
$do = shell_exec("(/Library/WebServer/Documents/test34/update.sh)"); 
var_dump($do); 
?> 

そしてこのSUCCESS結果ました:

を0
string(320) "spawn scp /Library/WebServer/Documents/test34/myfile.txt [email protected]:/Docs/myfile.txt 
[email protected]'s password: 

myfile.txt         0% 0  0.0KB/s --:-- ETA 
myfile.txt        100% 3649  3.6KB/s 00:00  
" 

したがって、Bashスクリプトでsleep 0.2を追加するだけで問題は解決しました。

私もsleep 0.1を試しましたが、エラーが発生しました。したがって、スリープ時間はあなたのファイルの大きさに依存するかもしれませんか? myfile.txtはわずか3.6kbで、睡眠時間は0.2秒でした。

ファイルが大きい場合は、sleep 1またはsleep 5などとお試しください。

この方法では問題は解決しますが、呼び出しごとにファイルサイズが変わる場合や、低速のssh接続がある場合は、問題が発生する可能性があります。

誰でもこの回答を改善することができたら、私はそれを高く評価します。

関連する問題