如果我通过php exec()运行命令:它不起作用.但是,如果我使用bash,它运行完美.知道问题可能是什么.?我想也许它正在执行rsync as apache并且不允许ssh登录.
exec('rsync -au /var/www/html/f1/ user@000.000.000.000:/var/www/html/f2/');
Run Code Online (Sandbox Code Playgroud)
PHP通常在Apache下运行mod_php.通常,Apache作为自己的用户帐户运行,独立于使用服务器的真实用户.
因此,在您的用户帐户的主目录下~/.ssh存储无密码SSH密钥的文件在Apache内部不可用,因为它没有您的homedir.即使Apache共享您的主目录,它仍然没有权限读取这些文件.
我对这些东西的调查让我知道:我可以在php中运行rsync,而后者又在apache下运行.但我必须考虑以下几点:
http用户必须可以访问私有身份验证密钥(可能带有空密码).必须将相应的公钥添加到远程
~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)
文件.这~是远程主机上远程用户的主目录.
一个本地配置文件
~/.ssh/config
Run Code Online (Sandbox Code Playgroud)
必须创建.这~是本地主机上http用户的主目录.该config文件只能由http用户访问.它可能包含以下内容:
Host *
User=www-data
IdentityFile=~/.ssh/nopass_rsa
Compression=no
Ciphers=arcfour
StrictHostKeyChecking=no
UserKnownHostsFile=/dev/null
Run Code Online (Sandbox Code Playgroud)
这User是远程主机上的用户名,IdentityFile是一个密钥文件.接下来的两个参数(Compression和Ciphers)允许略微增加吞吐量.最后两个参数允许跳过主机密钥检查.
如果您正在处理~/.ssh本地http用户的目录并且同时 ~是Web服务器的根目录,则存在安全问题:您(或任何其他人)只需键入即可访问您的密钥文件
www.your-domain.com/.ssh/
Run Code Online (Sandbox Code Playgroud)
在浏览器中.因此,拒绝在Web浏览器的配置中访问此目录将是一个好主意.
我的php代码示例:
exec('rsync -auq remote.host.com:/archive/ ./backup_bd/');
Run Code Online (Sandbox Code Playgroud)
这只是工作......
我想,我回答了你的问题.