![在 Web 浏览器上从 php 文件执行 rsync shell 命令](https://linux22.com/image/1592165/%E5%9C%A8%20Web%20%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8A%E4%BB%8E%20php%20%E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8C%20rsync%20shell%20%E5%91%BD%E4%BB%A4.png)
首先,我们要将更改从一个系统移动到另一个系统,为此,我们在synchfolders.sh
文件中有一个 shell 脚本,如下所示
rsync -av --delete -e 'sshpass -p Wordpress@123 ssh -p 22' [email protected]:/var/www/html/prosync/wp-content/plugins/ /var/www/html/devsync/wp-content/plugins >> /var/www/html/devsync/wp-content/mysynclog.txt
我们希望通过以下方式在 PHP 文件中执行此 shell 脚本shell_exec()
:从浏览器执行此 PHP 文件时,除了 rsync 命令之外,其他命令均在执行,但未rsync
执行。我们在 SO 中搜索了相关内容,并获得了链接https://stackoverflow.com/questions/30772816/php-exec-rsync-ssh-to-remote-server-not-working/30773063#30773063,正如这里所说,我们尝试从命令行执行 PHP 文件,并且运行正常,但通过浏览器则不行。为什么,请告诉我们我们在哪里犯了错误。提前致谢
答案1
一般来说:在那些不能从你通常的交互式 shell 中执行的脚本中,你需要确保使用绝对路径(/usr/bin/rsync
即代替rsync
)或设置正确的环境为 $PATH 赋予良好的值
作为一项额外的改进:您应该真正设置基于密钥的 ssh 身份验证以供脚本使用,而不是基于密码的身份验证。
当您停止使用密码并开始使用密钥时,您可以锁定并保护 ssh 服务器(禁用密码验证将阻止暴力攻击),更重要的是,您可以对使用特定密钥进行验证时允许的内容添加限制,这是使用密码无法做到的。
您可以限制脚本中使用的密钥,以便它只能用于来自特定主机的 rsync。
那么,即使您的脚本被泄露,被盗的也不是您的根密码(授予您服务器的完全控制权),而只是一个授予有限访问权限的私钥(如果它可以使用的话)。