如何在没有提示输入密码的情况下使用 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 "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/';
//exec($c,$data);
passthru($c,$data);
print_r($data);
这是我收到的:
255
并且没有文件从本地上传到远程服务器。
在网上搜索我发现了这个线索:
“您可以在此处使用 BAsh 和 Expect shell 代码的组合,但它不是很安全,因为这会自动进行 root 登录。为nobody
or apache
(执行 Apache 的任何用户)生成密钥。或者,安装 phpSuExec 、Suhosin 或 suPHP,以便脚本以调用它们的用户身份运行。”
好吧,我不知道如何为作为“apache”运行的 PHP“自动化 root 登录”。也许让脚本以实际用户身份运行是一个更好的主意,我不知道......谢谢!
更新: - 因为这工作正常:
passthru('ssh user@111.111.11.111 | ls',$data);
返回一个家庭目录,我可以肯定,自动登录没有问题。它主要是从 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 密钥。
这是我必须投入更多时间的事情。如果有人知道如何做到这一点,请,这将是很大的帮助。