如何在php脚本中使用rsync同步本地和远程文件夹而不提示输入密码?
我已经设置了一个公钥来为我的用户自动登录远程服务器.
因此cli运行没有任何问题:
rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/;
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从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);
Run Code Online (Sandbox Code Playgroud)
这是我收到的:
255
Run Code Online (Sandbox Code Playgroud)
并且没有文件从本地上传到远程服务器.
在网上搜索我发现了这个线索:
"你可以在这里使用BASh和Expect shell代码的组合,但它不会非常安全,因为这会自动执行root登录.为nobody或生成密钥apache(无论用户执行哪个Apache).或者,安装phpSuExec ,Suhosin或suPHP,以便脚本作为调用它们的用户运行."
好吧,我不知道如何"自动化root登录"PHP,它运行为"apache".也许是为了使脚本运行,因为实际的用户是一个更好的主意,我不知道...谢谢!
更新: - 因为这工作正常:
passthru('ssh user@111.111.11.111 | ls',$data);
Run Code Online (Sandbox Code Playgroud)
返回家庭垃圾箱列表,我可以肯定,自动登录没有问题.它是从PHP脚本运行rsync的东西.
更新:
所有问题都与以下事实有关:"当在命令行上运行时,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!';
Run Code Online (Sandbox Code Playgroud)
本地文件需求:0644远程文件夹需要:0775
我想如果解决方案不是用同一个用户bash运行php ...
@Yzmir Ramirez给出了这样的建议:"我认为你不想"将密钥复制到apache可以访问它的地方" - 这是违反安全规定的. …