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

时间:2017-10-07 15:25:56

标签: php linux raspberry-pi exec sudo

我使用本教程(抱歉,这是德语)来切换我的433MHz插槽: 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);

这是我到目前为止所尝试的内容:

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

我认为使用PHP执行“sudo”是一个权限问题。如果我尝试sudo la la它也不能正常工作。

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

  

有没有办法让二进制文件在没有sudo的情况下运行?

     

我尝试将SUID位(chmod u + s)设置为它也不起作用

如果设置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>