我需要将资源从主服务器同步到从服务器。我使用 rsync 是因为它可以使用增量文件列表递归同步文件夹。我已经能够使用 ssh-keys 以最简单的方式使其工作。一切正常,但它无法通过 php shell_exec 函数运行。这是我到目前为止所做的,以及我被困的地方。帮助将不胜感激!
主从服务器都在ubuntu 14.04.4
在用户的主目录中创建 ssh-key 文件夹。
mkdir ~/.ssh
chmod 0700 ~/.ssh
创建一个没有密码的私有(private)/公共(public) ssh key
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]
测试现有文件夹的同步...比方说 www/js/
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 命令”运行
测试.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 所建议的,我之前的回答是存在安全风险。 让 www-data 能够在没有密码的情况下访问远程主机可能真的很危险。更好的方法是设置一个 linux 用户,比如说“wwwsync”,它将处理与远程主机的 rsync,并让 www-data 在“wwwsync 用户”下执行 rsync。这样,我们可以通过设置 wwwsync 用户可以做什么和不能做什么来控制/保护 rsync。
创建一个将处理同步(比如 wwwsync)的 linux 用户,并在用户的主目录中创建 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
创建没有密码的私有(private)/公共(public) ssh key
ssh-keygen -f ~/.ssh/id_rsa -q -P ""
不确定从属服务器是否可以接收主公用 ssh key
// 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 就不会将不需要的资源同步到您的远程服务器。
关于php - 通过 php/linux 在服务器之间同步资源的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36870627/