使用rsync从php脚本内部从本地上传文件到远程服务器,而无需input密码

我已经设置了一个公钥来自动为我的用户在远程服务器上login。

所以这是从cli运行没有任何问题:

rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/; 

但是,当我尝试从PHP脚本(在本地服务器的网页上)运行相同的操作时:

 $c='rsync -r -a -v -e --log-file=FILE "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/'; //exec($c,$data); passthru($c,$data); print_r($data); 

这是我收到的:

 2011/01/23 19:18:29 [6401] rsync: connection unexpectedly closed (0 bytes received so far) [sender] 2011/01/23 19:18:29 [6401] rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7] 

权限qre像这样设置:

 Local: chmod 600 ~/.ssh/local-rsync-key chmod 600 ~/.ssh/local-apache-key chmod 700 ~/.ssh/ Remote: chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh/ chmod 700 ~/ 

我在〜/ .ssh / authorized_keys上注册了两个密钥:

 user@localserver apache@localserver 

我干的想法…我想我必须做远程/ etc / ssh / sshd_config文件中的其他东西。 我在两台服务器上运行Nginx。 谢谢你的帮助。

更新:

虽然我不能得到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

我也读过这个build议:“我不认为你想”把密钥复制到apache可以到达的地方“ – 这是一个安全违规。 更好的做法是将脚本作为一个安全用户运行,然后设置.ssh在服务器之间无密码login的密钥。

如果有人知道如何做到这一点,这将是非常有帮助的。

尝试-e "ssh -l user -i <keyfile>"

当在命令行上运行时, ssh使用$HOME/.ssh/的密钥文件,但是在PHP下,它使用Apache的用户运行,所以它可能没有$HOME ; 更less$HOME/.ssh/id_dsa 。 因此,要么是专门告诉它要使用哪个密钥文件,要么手动创build该目录及其内容。