![使用 PHP 启用 shell 脚本以不同用户身份运行](https://linux22.com/image/116732/%E4%BD%BF%E7%94%A8%20PHP%20%E5%90%AF%E7%94%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%BB%A5%E4%B8%8D%E5%90%8C%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C.png)
我的 Web 根目录中有名为 copy.sh 的 shell 脚本,其中包含以下几行
rsync -rzv -e 'ssh -p 199' test.txt [email protected]:/home/testuser/txt
ssh [email protected] -p 199 . /home/testuser/lty.sh > ltylog.txt 2>&1
该脚本首先将文本文件复制到我的远程服务器,然后运行 shell 脚本以在其他两台服务器之间同步该文件。我在当前服务器中为 testuser 生成 ssh 公钥/私钥并复制到远程服务器。我可以 ssh 到远程服务器,无需任何密码
ssh [email protected] -p 199
我可以运行上面的命令并可以进入我的远程服务器。在我的主机中,当我处于 testuser 状态时,我可以毫无问题地执行该 shell 脚本。它复制文件并运行远程脚本。我现在将脚本权限设置为 777。但我需要通过像这样运行 shell_exec 使用 PHP 来运行这个脚本
<?php
shell_exec('. /var/www/html/copy.sh');
echo "<pre>";
echo file_get_contents("ltylog.txt");
echo "<pre>";
?>
但是当我运行这个 PHP 时什么也没有发生。因为我认为执行shell脚本的用户是Apache用户而不是test用户。但当我 shell_exec PWD 或它运行完美的东西时,不是运行 shell 脚本。我禁用了 php 安全模式并为所有文件授予 777 权限。但我仍然无法让这个工作。
PS 我知道将 shell 脚本放在具有权限的 Web 根目录上会带来很大的安全风险。但这不是产品系统,我正在测试小型网络应用程序用于我们的内部目的。我执行此操作的服务器根本无法访问互联网。有人可以帮我解决这个问题吗?我正在寻找小解决方案。因为这个小型网络应用程序仅由一两个人使用。谢谢
答案1
如果我正确理解你的问题并且你不关心安全风险,你可以安装 sudo,将“www-data”(www-data 是 nginx/apache 使用的默认用户)添加到 sudoers 文件中,并具有所有权限,而不需要任何权限。需要密码并使用它以另一个用户的身份执行命令。
你可以这样做:
安装须藤:
apt-get install sudo
然后将用户添加到配置中:
nano /etc/sudoers
在最后一行添加:
www-data ALL=(ALL) NOPASSWD: ALL
最后,您可以编辑 php 以使用 sudo 执行命令:
shell_exec('sudo -u testuser /var/www/html/copy.sh');
@编辑
我已经设法让它在我的服务器上运行。只需按照以下步骤操作,它也应该适合您。
尝试用以下代码替换您的 PHP 代码:
<?php echo shell_exec('/bin/sh /var/www/html/copy.sh'); #this will display the result in your browser echo "<pre>"; echo file_get_contents("ltylog.txt"); echo "<pre>"; ?>
然后确保 www-data 有权访问 copy.sh 文件:
您可以给它一个 777 chmod,如下所示:
chmod 777 /var/www/html/copy.sh
或者您可以使该文件属于用户 www-data (由 apache 使用):
chown www-data:www-data /var/www/html/copy.sh
但如果您选择使用第二个选项,请确保 www-data 仍然可以通过应用 chmod 来执行该文件,如下所示:
chmod 755 /var/www/html/copy.sh
使文件可执行:
chmod +x /var/www/html/copy.sh
将 copy.sh 代码更改为:
rsync -rzv -e 'ssh -p 199' test.txt [email protected]:/home/testuser/txt ssh [email protected] -p 199 /bin/sh /home/testuser/lty.sh > ltylog.txt 2>&1
最后,确保 testuser 有权访问以下文件:
- /家/
- /home/测试用户/
- /home/testuser/lty.sh
- /home/testuser/ltylog.txt
如果您不关心安全性,您可以简单地在远程服务器的控制台中键入此内容
chmod 777 -R /home/
或者您可以手动检查每个文件以确保权限设置正确。