php - 如何从需要在 PHP 页面上以 root 身份运行的 Python 脚本返回输出?

标签 php python nginx

我正在摆弄我的树莓派,我刚刚开始安装 nginx 和 PHP。我有一个 DHT11 温度传感器连接到我的 Pi 上的 GPIO,并且我正在使用此版本 Adafruit script获取值。唯一的区别是它具有正确的 GPIO 值。在我的 Pi 上(如果重要的话,这一切都在我的内部网络上)我有 index.php 位于默认的 nginx 目录中,这就是它的输出:

<?php

#echo phpinfo();
$cmd = escapeshellcmd('/home/pi/simpleTemp.py');
$out = shell_exec($cmd);
echo $out;

现在,我没有得到任何输出,但我非常确定这是因为脚本需要以 root 身份运行。我已向该文件添加了执行权限,但我仍然一无所获。我的 PHP 安装工作正常。我应该使用 shell_exec 还是有更好的方法?

最佳答案

要以 root 身份运行它,您可以使用 sudo

<pre>
<?php

$cmd = '/home/pi/simpleTemp.py';
$out = shell_exec("sudo -u root " . escapeshellcmd($cmd));

if (is_null($out))
{
    echo "An error occurred."
    return;
}

echo $out;

这将在默认 shell 下以 root 身份运行脚本。如果您没有正确设置 $PATH,则可能需要将 sudo 的绝对路径指定为 /usr/bin/sudo在大多数系统上。

由于shell_exec()在错误处理方面有点限制,我们也可以只使用exec()。在此示例中,我们还将添加更多错误处理:

<pre>
<?php

if (ini_get('safe_mode'))
{
    echo "Safe mode is enabled; cannot execute!";
    return;
}

$cmd = '/home/pi/simpleTemp.py';
$output = array();
$returnCode = -1;

if (!is_executable($cmd))
{
    echo sprintf("Command '%s' is not executable!", $cmd);
    return;
}

exec(sprintf("/usr/bin/sudo -u root %s 2>&1", escapeshellcmd($cmd)), $output, $returnCode);
echo implode("\n", $output);

if ($returnCode != 0)
{
    echo sprintf("An error occurred (code: %d).", $returnCode);
    return;
}

当没有发生错误时,POSIX 程序退出并显示状态代码 0

另请注意此处的 2>&1,它将把输出从标准错误 (2) 重定向到标准输出 (1),以便该错误输出不会丢失。

我们可能遇到的另一个问题是,如果$PATH 环境变量不是我们所期望的。您的 Python 程序可能还依赖于健全的 $PATH。使用下面的示例获取和设置 $PATH:

<?php
/* To get the current $PATH. */
echo sprintf("Current PATH: %s", getenv('PATH'));

/* To set the $PATH. */
putenv('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin');

关于php - 如何从需要在 PHP 页面上以 root 身份运行的 Python 脚本返回输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34477981/

相关文章:

php - 为什么 PDOStatement 在单次获取时返回 false?

python - 使用 pandas 系列元素作为边界的简洁/优雅集成

带有 __main__ 的 cli 脚本的 python 实践

Nginx 与 Apache 代理通行证

caching - Nginx 反向代理缓存失效策略

php - 当所有对象都属于同一类型时,我可以省略 PHP in_array() 中的 strict 参数吗?

php - MYSQL 优化 : Fetching Data w. r.t 一周中的某一天

php - 从具有未知数量值的数组创建 PHP 嵌套数组

python - 使用 python 3.6 将多个文件并行加载到内存中的最佳方法是什么?

ssl - 如何在 Ubuntu 18.04 上使用 SSL 安装 NGINX + Varnish 6.1.0???