使用 PHP 启用 shell 脚本以不同用户身份运行

使用 PHP 启用 shell 脚本以不同用户身份运行

我的 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');

@编辑

我已经设法让它在我的服务器上运行。只需按照以下步骤操作,它也应该适合您。

  1. 尝试用以下代码替换您的 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>";
    ?>
    
  2. 然后确保 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
  1. 使文件可执行:

    chmod +x /var/www/html/copy.sh
    
  2. 将 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
    
  3. 最后,确保 testuser 有权访问以下文件:

    • /家/
    • /home/测试用户/
    • /home/testuser/lty.sh
    • /home/testuser/ltylog.txt

如果您不关心安全性,您可以简单地在远程服务器的控制台中键入此内容

    chmod 777 -R /home/

或者您可以手动检查每个文件以确保权限设置正确。

答案2

如果我理解正确的话,您希望以文件所有者的身份执行脚本,而不是以当前用户(apache 用户)的身份执行。

如果这就是您想要的,您可能会感兴趣设定值

简要总结其工作原理之前已发布。

相关内容