パスワードの入力を求められることなく、phpスクリプト内からrsyncを使用してローカルフォルダーとリモートフォルダーを同期するにはどうすればよいですか?
ユーザーのリモートサーバーへのログインを自動化するための公開鍵をすでに設定しています。
したがって、これはcliから問題なく実行されています。
rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/;
しかし、PHPスクリプトから(ローカルサーバーのWebページで)同じものを実行しようとすると、次のようになります。
$c='rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/';
//exec($c,$data);
passthru($c,$data);
print_r($data);
これは私が受け取るものです:
255
また、ローカルサーバーからリモートサーバーにファイルがアップロードされることはありません。
ネットで検索すると、この手がかりが見つかりました:
「ここではBAShとExpectシェルコードを組み合わせて使用できますが、ルートログインが自動化されるため、あまり安全ではありません。または(Apacheが実行されているユーザーに関係なく)のキーを生成しますnobody
。apache
または、phpSuExecをインストールします。 、Suhosin、またはsuPHPを使用して、スクリプトが呼び出されたユーザーとして実行されるようにします。」
さて、「apache」として実行されているPHPの「ルートログインを自動化」する方法がわかりません。たぶん、実際のユーザーとしてスクリプトを実行する方が良い考えです、私にはわかりません...ありがとう!
更新:-これは正常に機能するため:
passthru('ssh user@111.111.11.111 | ls',$data);
ホーム飼料のリストを返すと、自動ログインに問題はないと確信しています。これは、PHPスクリプトから実行されているrsyncを使用したものである必要があります。
- 念のため、ローカルフォルダとリモートフォルダにchmod-R0777もあります。しかし、私はまだそれを取得していません。
アップデート:
すべての問題は、「コマンドラインで実行する場合、sshは$ HOME / .ssh /のキーファイルを使用しますが、PHPではApacheのユーザーを使用して実行されるため、$HOMEがない可能性があります。 HOME / .ssh / id_dsa。したがって、使用するキーファイルを具体的に指定するか、そのディレクトリとその内容を手動で作成します。」
rsyncを取得することはできませんが、これがファイルをローカルからリモートに転送する方法です。
if($con=ssh2_connect('111.111.11.111',22)) echo 'ok!';
if(ssh2_auth_password($con,'apache','xxxxxx')) echo ' ok!';
if(ssh2_scp_send($con,'localfile','/remotefolder',0755)) echo ' ok!';
ローカルファイルのニーズ:0644リモートフォルダのニーズ:0775
解決策が同じユーザーbashでphpを実行することではないかと思います...
@Yzmir Ramirezは、次のように提案しました。「「apacheがアクセスできる場所にキーをコピーする」ことは、セキュリティ違反です。セキュリティで保護されたユーザーとして実行するようにスクリプトを変更してから、を設定することをお勧めします。サーバー間のパスワードなしのログイン用のsshキー。
これは私がもう少し時間を投資しなければならないものです。誰かがこれを行う方法を知っているなら、どうか、それは大きな助けになるでしょう。