我需要将主服务器的资源同步到从服务器。我使用rsync,因为它可以使用增量文件列表递归地同步文件夹。我已经能够使用ssh-key以最简单的方式工作。一切都很好,但它不能通过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/
是的,一切正常。
我登录奴隶服务器,递归删除www / js文件夹。
我登录主服务器
我创建了一个简单的php脚本来测试它是否可以作为“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安全地使用它?
答案 0 :(得分:0)
**编辑:这个答案不安全。请看我的其他答案**
我终于找到了如何让它发挥作用
将私人ssh-key复制到www-data的主文件夹。然后php将能够通过shell_exec函数进行rsync
www-data的主文件夹是/ 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/');
如果有人帮助......
但由于我在安全方面知道很多,但不能说我是专家,我想知道这是否安全?
答案 1 :(得分:0)
正如symcbean所建议的,我之前的回答是安全风险。 使www-data能够访问没有密码的远程主机可能非常危险。更好的方法是设置一个linux用户,让我们说“wwwsync”,它将处理与远程主机的rsync,并让www-data在“wwwsync用户”下执行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]
让www-data用户(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不会将不需要的资源同步到您的远程服务器。