【问题标题】:How do I allow www-data user to execute bash script with nginx如何允许 www-data 用户使用 nginx 执行 bash 脚本
【发布时间】:2017-12-12 09:02:14
【问题描述】:

我是一台运行 NGINX 和 PHP 的 Ubuntu 16.04 机器。我想让www-data 用户(通过Web 浏览器)能够访问PHP 页面(php-test.php),该页面将执行bash 脚本(script_test.sh)或使用shell_exec 执行Linux CLI 命令或exec.

我做了以下事情。

创建了我的 bash 脚本文件 script_test.sh

#!/bin/bash

whoami
echo $USER
echo 'test'

exit

当我从 CLI 运行它时,使用

./ script_test.sh

它确实有效,我可以看到 CLI 中回显的信息。

然后我追求的目标是允许 www-data 用户通过在 NGINX 的同一台机器上运行的 PHP 页面运行这个 bash 脚本。

我创建了我的 php 页面 (php_test.php),它包含以下内容

<?php

    chdir('/path/to/my/files/');
    shell_exec('./script_test.sh');  // ATTEMPT RUN SCRIPT
    shell_exec('/path/to/my/files/script_test.sh');  // ATTEMPT RUN SCRIPT

    echo 'test 123';  // SIMPLE ECHO IN THE PHP PAGE
?>

然后我运行以下命令来修改 sudoers 文件,让 www-data 访问 bash 脚本

sudo nano /etc/sudoers

我在其中添加了以下行

www-data ALL=NOPASSWD: /path/to/my/files/script_test.sh

然后我确保脚本是可执行的,为了我的测试,不担心安全性,我只是使用以下命令将其设置为 777

sudo chmod 777 script_test.sh

从那里我打开一个网络浏览器并浏览到本地主机 (NGINX) 网络服务器 (php_test.php),我在页面上看到的唯一内容是我从 PHP 中回显的“测试 123”...没有bash 脚本似乎已经运行了。我跟踪了 NGINX 错误日志,根本没有看到任何错误。

还有其他日志可以包含这方面的线索吗?

我还应该在这里检查什么?

【问题讨论】:

标签: php linux bash nginx


【解决方案1】:

shell_exec() 的结果以字符串形式返回。要在浏览器中显示它,只需添加 echo。

<?php

    chdir('/path/to/my/files/');
    echo shell_exec('./script_test.sh');  // ATTEMPT RUN SCRIPT
    echo shell_exec('/path/to/my/files/script_test.sh');  // ATTEMPT RUN SCRIPT

    echo 'test 123';  // SIMPLE ECHO IN THE PHP PAGE
?>

参见手册中的Return Values

执行命令的输出或 NULL 如果发生错误或 该命令不产生任何输出。

【讨论】:

    【解决方案2】:

    您可以尝试使用 passthru 代替 shell_exec,并查看输出吗?

    也试试这个,看看它是否显示在日志文件中:

    if(file_exists('/path/to/my/files/script_test.sh')) { die('File not found!'); }
    shell_exec("nohup /path/to/my/files/script_test.sh > /path/to/my/files/output.log &");
    

    另外,您是否使用 www-data 用户运行 PHP(检查您的 fpm 池)? 您对 /var/log/syslog 或 /var/log/auth.log 有任何错误吗? 修改sudo权限后重启服务器了吗?

    su - www-data -c "whoami"su - www-data -s /bin/bash -c "whoami" 输出什么?

    su - www-data -s /bin/bash -c "/path/to/my/files/script_test.sh" 有输出吗?

    【讨论】:

    • www-data 是运行 PHP 的用户。我在您的帖子/消息的顶部运行了 PHP sn-p,但它确实报告了已找到的脚本,但是 shell_exec 和基于 nohup 的命令的直通尝试根本没有生成任何东西。你提到的日志文件都没有给我任何线索。
    • 显而易见的问题...但是 shell_exec 在 php.ini 上是否允许? &lt;?php echo ini_get('disable_functions'); ?&gt; 打印有用的东西吗?其他的命令呢,是不是直接在命令行下工作的?
    • @peixogorms 当我运行时,我从我的 ini 文件中获得了以下禁用的功能 - 与我在 phpinfo() 中看到的相同... ,pcntl_wif 继续,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpanority>
    • 请注意,如果 PHP 在安全模式下运行,shell_exec 将不起作用。 php.net/manual/en/function.shell-exec.php 尝试删除所有这些,然后重试。另外,更基本的东西有用吗? &lt;?php $output = shell_exec('ls -lart'); echo "&lt;pre&gt;$output&lt;/pre&gt;"; ?&gt;
    • @peixogorms 我看到安全模式在 php 5.3 中已被弃用,并在 php 5.4 中被删除,我正在运行 PHP 7 并将研究如何启用 exec 和/或 shell_exec。使用该 sn-p 也没有输出。
    猜你喜欢
    • 2016-08-29
    • 2015-10-30
    • 2018-08-11
    • 2015-08-06
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多