【问题标题】:Execute php script without permission from web未经网络许可执行php脚本
【发布时间】:2016-04-14 21:59:39
【问题描述】:

我正在尝试执行一个 php 脚本,但我遇到了这种错误:

Warning: file_put_contents(/sys/class/gpio/export): failed to open stream: Permission denied in /home/pi/php-gpio/src/PhpGpio/Gpio.php on line 99
Warning: file_put_contents(/sys/class/gpio/gpio17/direction): failed to open stream: Permission denied in /home/pi/php-gpio/src/PhpGpio/Gpio.php on line 103

我尝试在 $ sudo visudo 中设置权限,如下所示:

www-data ALL=NOPASSWD: path/to/my/script

www-data ALL=NOPASSWD: ALL

但不工作,我只能在命令行中使用 sudo 来执行此脚本!

提前致谢!

【问题讨论】:

  • 对此的快速解决方法是:sudo chmod 777 /home/pi/php-gpio/src -R 但它本质上是一个安全漏洞。
  • @dvdciri 谁是您尝试运行的文件的所有者(ls -l /path/to/file)以及文件权限是什么?
  • 哎呀,参数实际上应该是sudo chmod 777 /sys/class/gpio/ -R,但您仍然应该找到一种方法将数据作为 www-data 写入特定文件夹中。将该目录的所有者更改为带有sudo chown www-data /path/to/folder 的www-data 并授予所有者写入权限。
  • 好的,首先感谢您的帮助。其次,这是一个 api,应该从客户端运行。我将为这些 API 设置身份验证,所以我不关心安全性.. @AdelBachene 所有者是用户“pi”
  • @dvdciri 我猜你的 php 是以 root 用户身份运行的,所以你只需要将文件权限更改为 777 并注意安全^^

标签: php linux permissions sudo raspbian


【解决方案1】:

如果你在你的电脑上使用,你必须更改默认目录权限:

$ sudo chmod -R +w /sys/class/gpio/export

否则,如果您在服务器、服务器面板和部分文件(例如 CPanel)中运行代码,则更改权限并添加写入权限。

另一种方式是运行 exec() 命令:

<?php
exec('chmod -R +w /sys/class/gpio/export');
?>

但是,php 应该有 exec 权限并以 root 运行!

【讨论】:

  • 我在服务器上作为 API 运行它。我会尽快测试你的建议。谢谢
  • 我已经测试过 exec('chmod -R +w /sys/class/gpio/export');并且总是不工作。这个 sudo chmod -R +w /sys/class/gpio/export 也不起作用..
【解决方案2】:

我最近发布了一个项目,该项目允许 PHP 获取并与真正的 Bash shell 交互(如果需要,则以 root 身份),它解决了 exec() 和 shell_exec() 的限制。在这里获取:https://github.com/merlinthemagic/MTS

下载后您只需使用以下代码:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('/sys/class/gpio/export');
$return2  = $shell->exeCmd('/sys/class/gpio/gpio17/direction');

//the return will be a string containing the return of the command
echo $return1;
echo $return2;

就安全性而言,它比以 root 身份运行 apache 或您的问题中广泛开放的 sudo 权限要好得多。但是让 PHP 靠近根目录总是很棘手。

我构建的项目通过以下两种方式之一实现了 root bash shell:

1) 您允许 apache 使用 sudo python。

2) 每次需要带有 root 设置的 shell 时,您都将 root 凭据传递给对象。

选择你的毒药。 :) 阅读文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多