我需要同步从主服务器到从服务器的资源。 我使用rsync,因为它可以使用增量文件列表recursion地同步文件夹。 我已经能够使用ssh-keys以最简单的方式工作。 一切都很好,但它不能通过PHP shell_exec函数工作。 这是我迄今为止所做的,以及我陷入困境的地方。 帮助将不胜感激!
主从服务器在Ubuntu 14.04.4上
mkdir ~/.ssh chmod 0700 ~/.ssh
ssh-keygen -f ~/.ssh/id_rsa -q -P ""
// log in slave server mkdir ~/.ssh chmod 0700 ~/.ssh touch ~/.ssh/authorized_keys chmod 0644 ~/.ssh/authorized_keys
// log in master server su ssh-copy-id -i ~/.ssh/id_rsa.pub [slave user]@[slave host]
rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/
耶,一切正常。
我login从服务器,recursion地删除www / js文件夹。
我login主服务器
我创build一个简单的PHP脚本来testing它是否作为一个“shell命令”
test.php的
var_dump(shell_exec('rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/'));
同步不能从PHP工作。 可能是因为php运行宽度www-data用户? 我怎样才能使它从pĥp安全地工作?
正如symcbean所建议的,我之前的回答是安全风险。 使万维网数据能够访问远程主机没有密码可能是非常危险的 。 更好的方法是建立一个linux用户,让“wwwsync”来处理远程主机的rsync,让www-data在“wwwsync user”下执行rsync。 这样,我们可以通过设置wwwsync用户可以和不可以做的事来控制/保护rsync。
创建一个处理同步的Linux用户(让我们说wwwsync),并在用户的主目录下创建ssh-key文件夹。
// log as root user adduser wwwsync // log as wwwsync su wwwsync // create ssh folder for ssh key creation mkdir ~/.ssh chmod 0700 ~/.ssh
创建一个没有密码的私人/公共ssh密钥
ssh-keygen -f ~/.ssh/id_rsa -q -P ""
不确定的从服务器可以接收主公共ssh密钥
// log in slave server mkdir ~/.ssh chmod 0700 ~/.ssh touch ~/.ssh/authorized_keys chmod 0644 ~/.ssh/authorized_keys
将公钥复制到从属服务器(我要同步资源的位置)
// log in master server as wwwsync su ssh-copy-id -i ~/.ssh/id_rsa.pub [slave user]@[slave host]
使万维网数据用户(PHP)能够在wwwsync用户下执行rsync
// log in as root su root // edit sudo configuration sudo visudo // add this line at the bottom of the file www-data ALL=(wwwsync) NOPASSWD: /usr/bin/rsync
这一行然后将正常工作从PHP
shell_exec('rsync -H -u wwwsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/')
下一个重要步骤 :确保wwwsync根据您的需要正确设置权限和权限,因此www-data不会将不需要的资源同步到您的远程服务器。
**编辑:这个答案是不安全的。 请看我的其他答案**
我终于找到了如何使它工作
将私人ssh-key复制到www-data的home文件夹。 然后php将能够通过shell_exec函数rsync
www-data的home文件夹是/ var / www /(在我的情况下是Ubuntu 14)
mkdir /var/www/.ssh chown www-data /var/www/.ssh chmod 0700 /var/www/.ssh
cp ~/.ssh/id_rsa /var/www/.ssh chown www-data /var/www/.ssh/id_rsa chmod 0600 /var/www/.ssh/id_rsa
这条线现在适用于我:
shell_exec('rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress [absolute_path]/www/js/ [slave user]@[slave host]:~/www/js/');
如果它帮助某人
但是既然我对安全有了很多的了解,但是不能说我是专家,我不知道这是否安全?