问题 通过PHP exec()使用SSH无密码ssh登录进行Rsync


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

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

7602
2018-02-01 01:02


起源



答案:


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

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


7
2018-02-01 01:06



所以底线是没有办法通过php / exec使用rsync。 - DaedBaet
不,最重要的是,你可以。您只需要为正在使用的用户帐户设置适当的权限。 - evan
@evan ...文件必须在它正在搜索的地方。 - Borealid
当然有一种方法,但不是在共同的托管帐户上。 - sanmai
你的答案是不必要的神秘。 @evan,你建议给apache访问密码无密码登录。如果是这样的话<我必须将密钥放在它的主目录中,我认为是/ var / www /。 Borealid,我不明白你想说什么 - “文件必须在它正在搜索的地方”。 - DaedBaet


答案:


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

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


7
2018-02-01 01:06



所以底线是没有办法通过php / exec使用rsync。 - DaedBaet
不,最重要的是,你可以。您只需要为正在使用的用户帐户设置适当的权限。 - evan
@evan ...文件必须在它正在搜索的地方。 - Borealid
当然有一种方法,但不是在共同的托管帐户上。 - sanmai
你的答案是不必要的神秘。 @evan,你建议给apache访问密码无密码登录。如果是这样的话<我必须将密钥放在它的主目录中,我认为是/ var / www /。 Borealid,我不明白你想说什么 - “文件必须在它正在搜索的地方”。 - DaedBaet


我对这些东西的调查让我知道:我 能够 在php中运行rsync,然后在apache下运行。但是我 必须 考虑一些要点:

  • 主目录必须存在于用户在哪个帐户下在本地计算机(可能是http)上启动Web服务器,以及远程用户在哪个帐户下连接到远程主机。
  • 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/');

哪个才行......

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


5
2018-04-04 09:32





以下是您指定SSH获取密钥的位置:

exec('rsync -e "ssh -i /home/you/.ssh/id_dsa" ...')

我假设Apache在用户下运行,可以读取你的 id_dsa 要么 id_rsa


2
2018-02-01 02:11



你会遇到试图做到这一点的问题。 ssh守护进程非常具体关于这些文件的用户权限,如果有任何不妥之处,则不会使用它们。比如当它不是你自己的主文件夹时试图使用它们。 - datashaman


将命令存储在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');
?>

1
2018-02-01 03:34





由于以上建议都不起作用,我不得不允许Apache用户帐户无密码访问我上传图像所需的服务器。它就像我的魅力,就像我需要的那样,感谢所有试图帮助解决我的问题的人。


1
2018-02-09 02:18



解决方案不好如果有人攻击Apache,攻击者可以使用无密码访问。更好用 su 它允许您切换用户。 - DanFromGermany