所以我有以下设置:
我想自动安全地从服务器B创build备份到服务器C 我可以在服务器B上创build一个PHP文件,在访问时会创build一个备份。 但是,它将需要在服务器上运行PHP。
现在我也可以使用PHP中的ssh2_connect ,我只能在服务器B上运行PHP并执行命令,但这些命令需要root权限。 因此,任何黑客攻击Web服务器或其他方式的人都可以立即访问这些文件。
我有一个在我的networking服务器上的“命令”做的数据库。 像备份虚拟机服务器1,然后恢复虚拟机服务器8等。这就是为什么我需要发送“命令”从服务器A到服务器B 我的问题是,安全地做这个最好的解决scheme是什么? 我显然不想让任何人访问服务器B除了我。
服务器A远程地在服务器B上运行命令,而不是让服务器B只要求服务器A运行哪些命令?
安排一个cron工作,沿着这些线:
10 01 * * * /usr/local/bin/do_backups
哪里do_backups看起来像这样:
#!/usr/bin/env php <?php $conn = pg_connect('host=servera dbname=backup'); pg_prepare($conn, 'get_commands', 'SELECT command FROM backup_commands'); $result = pg_execute($conn, 'get_commands', array()); $commands = pg_fetch_result($result); foreach($commands as $cmd) { system(escapeshellcmd($cmd)); } ?>
显然,这是一种伪代码,因为我不知道你的数据库是什么样的,所以如果不清楚它在做什么,请告诉我。 只要记住可能不受信任的参数就可以逃脱你的命令。 另外,我用PHP写了一段时间,所以在我的代码中可能会有错误;)
你想要做的是在服务器B上创build一个定期做备份的cron作业。 如果你已经在服务器上安装了php_cli ,如果你知道这一点,这甚至可以是一个PHP脚本。
创build你喜欢的任何forms的备份脚本,然后以root身份,用crontab -e将它添加到crontab -e 。 例:
0 1 * * * /root/mybackupscript.sh
会在每天晚上01:00在root的home文件夹中运行脚本mybackupscript.sh 。
有关更多信息,请参阅man cron和man crontab 。
在你编辑之后,还有其他一些build议:
WRT Devator的回答是,您可以使用纯PHP PHP实现phpseclib以交互方式执行SSH。 下面是一个关于sudo的phpseclib文档的例子,它通常提供一个密码的交互提示:
<?php include('Net/SSH2.php'); $sftp = new Net_SSH2('www.domain.tld'); $sftp->login('username', 'password'); echo $sftp->read('username@username:~$'); $sftp->write("sudo ls -la\n"); $output = $sftp->read('#Password:|username@username:~\$#', NET_SSH2_READ_REGEX); echo $output; if (preg_match('#Password:#', $lines)) { $ssh->write("password\n"); echo $sftp->read('username@username:~$'); } ?>
您还可以使用$ ssh-> setTimeout(xx)来适应即使使用正则expression式匹配也不会返回所需内容的命令。