php - 如何通过 PHP exec() 在 Raspberry 上使用 sudo 执行二进制文件?

标签 php linux raspberry-pi exec sudo

我使用本教程(抱歉,是德语)来切换我的 433MHz socket : https://tutorials-raspberrypi.de/raspberry-pi-funksteckdosen-433-mhz-steuern/

我编译了一个通过 RC 代码打开和关闭套接字的文件。如果我直接在 Pi Shell 上运行它,它工作正常:

sudo /var/www/html/bin/RPiControl -3313

但是如果我在我的 PHP 脚本上通过 exec() 运行它,它不会:

exec('sudo /var/www/html/bin/RPiControl -3313', $output, $return);

到目前为止,这是我尝试过的:

  • 没有返回/输出值
  • 我在默认 Raspian 的 Raspi 3 上使用 lighttpd 作为网络服务器
  • 脚本位于/var/www/html
  • 二进制文件位于/var/www/html/bin(也试过主目录)
  • webserver/php 似乎在默认用户“pi”下运行(我想知道,在我的其他 linux 机器上它曾经是 www-data 用户)
  • 我尝试将 sudo 权限授予“pi”用户(也尝试了 www-data)
  • 我将 PHP 脚本和二进制文件设为“Pi”用户所有者
  • 我用 777 修改了 PHP 脚本
  • 我已经试过了:sudo in php exec()

我猜想在 PHP 执行中使用“sudo”是一个权限问题。如果我尝试 sudo la la,它也无法正常工作。

如何允许二进制文件在没有 sudo 的情况下执行,或者允许 PHP 使用 sudo

提前致谢。

最佳答案

Is there a way to allow the binary to run without sudo?

I tried setting the SUID Bit (chmod u+s) bit it didn't work as well

如果您设置 SUID 位,可执行文件将以与拥有可执行文件的用户相同的权限运行。

因此,如果可执行文件由用户 hello 所有,则可执行文件将以用户 hello 的访问权限运行,如果文件由管理员 (root) 它以管理员权限运行。

因此,在设置 SUID 位之前,您首先必须更改可执行文件的所有者(如果 SUID 位已经设置,它将被删除,必须重新设置):

sudo chown root:root /some/file/name
sudo chmod u+s /some/file/name

如果可执行文件调用另一个可执行文件(它使用 exec 启动其他可执行文件),默认情况下另一个可执行文件不会以更改的访问权限执行。

因此,您不能将 SUID 位用于 shell 脚本...

可以使用设置了 SUID 位的文件的源代码中的以下代码行更改此行为(如果程序是用 C 或 C++ 编写的):

setreuid(geteuid(), geteuid());

(需要以下标题 #include 行:)

#include <unistd.h>

关于php - 如何通过 PHP exec() 在 Raspberry 上使用 sudo 执行二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46621898/

相关文章:

php - 使用 move_uploaded_file() 没有这样的文件或目录

linux - 如何在不重命名原始文件的情况下重命名复制的文件

linux - Expect/TCL 简单过程/变量问题

python - 自动检测 Raspberry-Pi 相机

PHP:如何使用数组索引访问数组元素值

php - CakePHP - 如何使用 Helpers 与目标 ="_blank"建立图像链接

linux - 在终端窗口 wheezy 中启动文件管理器

Python帮助使用for循环来改变x

javascript - 如果选择此选项并且此选项更改为 3 选项

linux - 将 SHIFT+H 键击发送到 screen