相关疑难解决方法(0)

使用php脚本中的rsync同步本地和远程文件夹,而无需输入密码

如何在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的东西.

  • 我还在本地和远程文件夹上有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!';
Run Code Online (Sandbox Code Playgroud)

本地文件需求:0644远程文件夹需要:0775

我想如果解决方案不是用同一个用户bash运行php ...

@Yzmir Ramirez给出了这样的建议:"我认为你不想"将密钥复制到apache可以访问它的地方" - 这是违反安全规定的. …

php ssh rsync openssh

5
推荐指数
1
解决办法
9536
查看次数

标签 统计

openssh ×1

php ×1

rsync ×1

ssh ×1