【问题标题】:Execute Python script from Php从 PHP 执行 Python 脚本
【发布时间】:2015-10-26 23:23:18
【问题描述】:

我的树莓派上有一个 PHP 网页,带有 2 个按钮(打开和关闭) on 按钮按钮重定向到 On.php 关闭按钮重定向到 Off.php 在“/usr/lib/cgi-bin”中,我有一个我想执行的 python 脚本(script.py) 我可以通过键入从终端完美地执行它

cd /usr/lib/cgi-bin
sudo python script.py

如果我从终端执行,它会起作用。

问题是我的“/var/www”文件夹中的 PHP 文件 (On.php)。 这是我写的:

<?php
exec('cd /usr/lib/cgi-bin');
exec('sudo python script.py');
?>

为什么脚本是从终端执行,而不是我的 PHP?

【问题讨论】:

  • 你的超级用户有密码吗?

标签: php python apache2 raspberry-pi execute


【解决方案1】:

您不能在 PHP 脚本中使用 sudo。 Apache 是从一个用户运行的(www-data generaly),所以编辑这个文件:/etc/sudoers

然后添加这一行:

www-data ALL=(ALL) NOPASSWD:ALL

小心!这将授权 PHP 脚本调用所有函数,您可以通过脚本或 Python 命令调整更改“ALL”。

然后在你的 exec 命令中精确你的用户:

<?php
exec('sudo -u www-data python /usr/lib/cgi-bin/script.py')

【讨论】:

  • 这会删除密码吗?因为我有公开转发的服务器端口。我不希望任何人进入我的服务器。
  • 它将删除用户 www-data 的密码,这就是为什么您可以向 NOPASSWD 询问某些命令,例如 NOPASSWD:python。它不会改变其他用户的任何东西。
  • 好吧,我不是专家,我只是想确保没有人能以超级用户或任何其他用户的身份入侵我的树莓派。
  • 这允许在没有密码的情况下使用 sudo,只有用户 www-data。此用户无法通过 SSH 连接,因此没有风险。
  • sudo www-data 没有密码根本不安全。这不是关于 SSH,而是关于 Nginx、Apache2 等。如果其中一台服务器被利用,它可以执行远程命令。如果它有root 特权,有些高兴有些难过。它总是发生。
【解决方案2】:

试试这个,它应该可以工作:

<?php 
system("cd /usr/lib/cgi-bin");
system("sudo python script.py");
?>

甚至这个:

<?php 
system("cd /usr/lib/cgi-bin && sudo python script.py");
?>

【讨论】:

    【解决方案3】:

    在较旧的 Raspbian 发行版中,您需要将文件放在 /var/www/file.py 中。所以在你的 file.php 你添加:

    {
        exec("sudo python /var/www/file.py");
    }
    

    在较新的 Raspbian Jessie 上,您需要将文件放在 /var/www/html/file.py,因此您需要在 file.php 中添加:

    {
        exec("sudo python /var/www/html/file.py");
    }
    

    或者只是任何 file.py

    <?php
    {
      exec("sudo python test.py");
    }
    

    ?>

    注意:为此,您需要先编辑一个文件以添加这些行以允许无密码 sudo

    sudo nano /etc/sudoers

    然后到底部添加这个

    pi ALL=(ALL) NOPASSWD: ALL<br>
    www-data ALL=(ALL) NOPASSWD: ALL
    

    【讨论】:

    • 永远不要使用 NOPASSWD: ALL 将 www-data 添加到 sudoers!这可能会变成一个非常大的安全问题。见上面@dotslash 的评论
    • 是的,如果它在线的话,这个 pi 只是一个家庭遥控器,仅此而已。对于阅读本文的人,不要这样做是为了控制互联网
    • 所以?如果它连接到网络,如果有人足够努力,它可能会受到损害。只是不要这样做。有更好的方法,比如 Alberto Pagani 的回答。
    猜你喜欢
    • 1970-01-01
    • 2019-09-23
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多