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

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

我已经设置了一个公钥来让我的用户自动登录远程服务器。

因此从 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] 

权限设置如下:

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

我还读过这样的建议:“我不认为你想“将密钥复制到 apache 可以获取的地方”——这是一种安全违规行为。最好将脚本更改为以安全用户身份运行,然后设置 .ssh 密钥以便在服务器之间进行无密码登录。

如果有人知道该怎么做,请告诉我,这将会很有帮助。

答案1

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

在命令行上运行时,ssh使用 上的密钥文件$HOME/.ssh/,但在 PHP 下,它使用 Apache 的用户运行,因此可能没有$HOME; 更不用说 了$HOME/.ssh/id_dsa。因此,要么你明确地告诉它要使用哪个密钥文件,要么手动创建该目录及其内容。

相关内容