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