如果我通过php exec()运行命令:它不起作用。但是,如果我使用bash,它运行完美。知道问题可能是什么。?我想也许它正在执行rsync as apache而不允许ssh登录。
exec('rsync -au /var/www/html/f1/ user@000.000.000.000:/var/www/html/f2/');
答案 0 :(得分:7)
PHP通常在mod_php
下的Apache中运行。通常,Apache作为自己的用户帐户运行,独立于使用服务器的真实用户。
因此,在Apache内部的PHP中无法使用在您的用户帐户主目录下存储无密码SSH密钥的~/.ssh
文件,因为它没有您的homedir。即使Apache共享您的主目录,它仍然没有权限读取这些文件。
答案 1 :(得分:5)
我对这些东西的调查让我知道:我可以在php中运行rsync,而php又在apache下运行。但我必须考虑一些要点:
http用户必须可以访问私有身份验证密钥(可能带有空密码)。必须将相应的公钥添加到远程
~/.ssh/authorized_keys
文件。这里~
是远程主机远程用户的主目录。
本地配置文件
~/.ssh/config
必须创建。这里~
是本地主机上http用户的主目录。只能为http用户访问config
文件。它可能包含以下内容:
Host *
User=www-data
IdentityFile=~/.ssh/nopass_rsa
Compression=no
Ciphers=arcfour
StrictHostKeyChecking=no
UserKnownHostsFile=/dev/null
此处User
是远程主机的用户名,IdentityFile
是密钥文件。接下来的两个参数(Compression
和Ciphers
)可以略微提高吞吐量。最后两个参数允许跳过主机密钥检查。
如果您正在处理本地http用户{strong>的~/.ssh
目录, ~
同时是Web服务器的根目录,那么安全问题:您(或其他任何人)只需输入
www.your-domain.com/.ssh/
在浏览器中。因此,拒绝在Web浏览器的配置中访问此目录将是一个好主意。
我的php代码示例:
exec('rsync -auq remote.host.com:/archive/ ./backup_bd/');
哪个有效...
我想,我回答了你的问题。
答案 2 :(得分:2)
以下是您如何指定SSH拿起钥匙的位置:
exec('rsync -e "ssh -i /home/you/.ssh/id_dsa" ...')
我认为Apache在用户下运行,可以阅读id_dsa
或id_rsa
。
答案 3 :(得分:1)
将命令存储在shell脚本中,因为它没有动态部分,然后使用exec()执行shell脚本。
# on command line
echo 'rsync -au /var/www/html/f1/ user@000.000.000.000:/var/www/html/f2/' > sync_files
# On command line
chmod +x sync_files
<?php
// in php
exec('sync_files');
?>
答案 4 :(得分:1)
由于以上建议都不起作用,我不得不允许Apache用户帐户无密码访问我上传图像所需的服务器。它就像我的魅力,就像我需要的那样,感谢所有试图帮助解决我的问题的人。