我使用本教程(抱歉,是德语)来切换我的 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/