如何在 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
并且没有文件从本地上传到远程服务器。
在网上搜索我发现这条线索 http://www.mombu.com/php/php/t-calling-rsync-from-php-script-3752852.html:
“您可以在这里使用 BASh 和 Expect shell 代码的组合,但这不是很安全,因为这会自动执行 root 登录。为以下内容生成密钥nobody
or apache
(无论以哪个用户身份执行 Apache)。或者,安装 phpSuExec、Suhosin 或 suPHP,以便脚本以调用它们的用户身份运行。”
好吧,我不知道如何为以“apache”运行的 PHP“自动 root 登录”。也许让脚本作为实际用户运行是一个更好的主意,我不知道......谢谢!
更新:
- 因为这工作正常:
passthru('ssh [email protected] /cdn-cgi/l/email-protection | ls',$data);
返回主目录列表,我可以确定,自动登录没有问题。它必须是从 PHP 脚本运行 rsync 的东西。
- 我还在本地和远程文件夹上设置了 chmod -R 0777 以防万一。但我还没明白。
UPDATE:
所有问题都与以下事实有关:“在命令行上运行时,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 密钥以在服务器之间进行无密码登录。
这是我必须投入更多时间的事情。如果有人知道如何做到这一点,拜托,这会有很大的帮助。