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

Dae*_*aet 11 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/');
Run Code Online (Sandbox Code Playgroud)

Bor*_*lid 7

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

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


Ser*_*sak 5

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

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

  • 如果您正在处理~/.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)

这只是工作......

我想,我回答了你的问题.


Dae*_*aet 1

由于上述建议均不起作用,因此我必须允许 Apache 用户帐户无密码访问我需要上传图像的服务器。它的工作原理就像我所需要的那样,感谢所有试图帮助解决我的问题的人。