通过PHP exec()与SSH无密码ssh登录的Rsync

时间:2012-02-01 01:03:00

标签: php apache rsync

如果我通过php exec()运行命令:它不起作用。但是,如果我使用bash,它运行完美。知道问题可能是什么。?我想也许它正在执行rsync as apache而不允许ssh登录。

exec('rsync -au /var/www/html/f1/ user@000.000.000.000:/var/www/html/f2/');

5 个答案:

答案 0 :(得分:7)

PHP通常在mod_php下的Apache中运行。通常,Apache作为自己的用户帐户运行,独立于使用服务器的真实用户。

因此,在Apache内部的PHP中无法使用在您的用户帐户主目录下存储无密码SSH密钥~/.ssh文件,因为它没有您的homedir。即使Apache共享您的主目录,它仍然没有权限读取这些文件。

答案 1 :(得分:5)

我对这些东西的调查让我知道:我可以在php中运行rsync,而php又在apache下运行。但我必须考虑一些要点:

  • 对于在本地计算机(可能是http)上启动Web服务器的帐户以及您要连接到远程主机的帐户的远程用户,必须存在主目录。
  • 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是密钥文件。接下来的两个参数(CompressionCiphers)可以略微提高吞吐量。最后两个参数允许跳过主机密钥检查。

  • 如果您正在处理本地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_dsaid_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用户帐户无密码访问我上传图像所需的服务器。它就像我的魅力,就像我需要的那样,感谢所有试图帮助解决我的问题的人。