【发布时间】:2011-06-14 02:20:30
【问题描述】:
如何在 php 脚本中使用 rsync 同步本地和远程文件夹而不提示输入密码?
我已经设置了一个公钥来为我的用户自动登录远程服务器。
所以这在 cli 中运行没有任何问题:
rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/;
但是,当我尝试从 PHP 脚本(在我本地服务器的网页上)运行相同的脚本时:
$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
并且没有文件从本地上传到远程服务器。
在网上搜索我找到了this clue:
“你可以在这里使用 BAsh 和 Expect shell 代码的组合,但它不是很安全,因为这会自动进行 root 登录。为 nobody 或 apache 生成密钥(无论用户是哪个 Apache正在执行)。或者,安装 phpSuExec、Suhosin 或 suPHP,以便脚本以调用它们的用户身份运行。”
好吧,我不知道如何为作为“apache”运行的 PHP“自动化 root 登录”。也许让脚本以实际用户身份运行是一个更好的主意,我不知道...谢谢!
更新: - 因为这工作正常:
passthru('ssh user@111.111.11.111 | ls',$data);
返回一个home foder的列表,我可以肯定,自动登录没有问题。它主要是从 PHP 脚本运行 rsync 的东西。
- 我还在本地和远程文件夹中设置了 chmod -R 0777 以防万一。但我还没明白。
更新:
所有问题都与“在命令行上运行时,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 密钥。
这是我必须投入更多时间的事情。如果有人知道如何做到这一点,请,这将是很大的帮助。
【问题讨论】:
-
如何执行 PHP 脚本? cron/从命令行手动/Apache 执行它/...
-
来自我本地服务器 (Nginx) 中的一个 url。