Execute Python script from Php
我在树莓派上有一个PHP网页,带有2个按钮(打开和关闭)
on按钮上的按钮重定向到On.php
关闭按钮重定向到Off.php
在" / usr / lib / cgi-bin"中,我有一个要执行的python脚本(script.py)
我可以通过在终端上输入
来完美地执行它
1 2
| cd /usr/lib/cgi-bin
sudo python script.py |
如果我从终端进行操作,它将起作用。
问题是我的" / var / www"文件夹中的PHP文件(On.php)。
这是我写的:
1 2 3 4
| <?php
exec('cd /usr/lib/cgi-bin');
exec('sudo python script.py');
?> |
为什么从终端而不是从我的PHP执行脚本?
您不能在PHP脚本中使用sudo。 Apache正在从用户运行(通常是www-data),因此请编辑此文件:/etc/sudoers
然后添加此行:
1
| www-data ALL=(ALL) NOPASSWD:ALL |
保养!这将授权所有功能由PHP脚本调用,您可以通过脚本或Python命令更改更改的" ALL"。
然后在您的exec命令中精确定位您的用户:
1 2
| <?php
exec('sudo -u www-data python /usr/lib/cgi-bin/script.py') |
- 这会删除密码吗?因为我已将服务器端口公开转发。我不希望任何人进入我的服务器。
-
它将删除用户www-data的密码,这就是为什么您可以要求NOPASSWD执行某些命令的原因,例如NOPASSWD:python。它不会改变其他用户的东西。
-
好的,我不是专家,我只是想确保没有人可以以超级用户或任何其他用户的身份入侵我的树莓派。
-
这允许不使用密码而仅使用用户www-data来使用sudo。该用户无法通过SSH连接,因此没有风险。
-
没有密码的sudo www-data根本不安全。它与SSH无关,与Nginx,Apache2等无关。如果其中一台服务器被利用,它可以执行远程命令。如果它具有root特权,则有些高兴,有些悲伤。它总是发生。
尝试一下,它应该可以正常工作:
1 2 3 4
| <?php
system("cd /usr/lib/cgi-bin");
system("sudo python script.py");
?> |
甚至这个:
1 2 3
| <?php
system("cd /usr/lib/cgi-bin && sudo python script.py");
?> |
在较旧的Raspbian发行版上,您需要将文件放置在/var/www/file.py中。因此,在您的file.php中添加:
1 2 3
| {
exec("sudo python /var/www/file.py");
} |
在较新的Raspbian Jessie上,您需要将文件放置在/var/www/html/file.py中,因此在file.php中,您需要添加:
1 2 3
| {
exec("sudo python /var/www/html/file.py");
} |
或者只是任何file.py
1 2 3 4
| <?php
{
exec("sudo python test.py");
} |
?>
注意:要执行此操作,您需要首先编辑文件以添加以下行以允许无密码sudo
sudo nano /etc/sudoers
然后转到底部并添加此
1 2
| pi ALL =(ALL ) NOPASSWD : ALL
www -data ALL =(ALL ) NOPASSWD : ALL |
-
永远不要使用NOPASSWD: ALL将www-data添加到sudoers中!这会变成一个很大的安全问题。参见上面的@dotslashs评论
-
是的,如果在线上可以,这个pi仅仅是一个房子遥控器,仅此而已。对于阅读内容的人来说,这样做是为了控制互联网
-
所以?如果将其连接到网络,则如果有人努力尝试,它可能会受到威胁。只是不要这样做。有更好的方法,例如Alberto Paganis的答案。