【问题标题】:Writing to file outside var/www写入 var/www 之外的文件
【发布时间】:2014-05-12 12:00:55
【问题描述】:

将如何写入 var/www/ 目录之外的文件?

我正在尝试写入“/sys/class/leds/led0/brightness”,这是一个控制 Raspberry Pi 上板载 LED 亮度的文件,但我认为 var/ 之外的所有文件都是相同的www/.

我已经设置了权限,任何人都可以通过使用来读/写

sudo chmod -R 777 /sys/class/leds/led0

这是我的 HTML/php 代码:

    <?php
    if(isset($_GET['button1'])) {
        toggle();
    }
    function toggle()
    {
        error_reporting(E_ALL);
        $f = fopen("/sys/class/leds/led0/brightness", "r");
        $value = fgets($f);

        fclose($f);

        if ($value = "1") {
            $value = "0";
        } elseif ($value = "0") {
            $value = "1";
        }
        $f = fopen("/sys/class/leds/led0/brightness", "w+");

        fwrite($f, $value);

        fclose($f);
    }
?>

<html><body>
    <h1>Hello World!</h1>
    <input type=button onClick='location.href="?button1"' value='Toggle Lamp'>
</body></html>

没有任何回应。没有错误,文件中没有输出,什么都没有。

附:请注意,它应该是/sys/class/leds/led0/brightness 而不是/sys/class/leds/led0/brightness.txt

这是一个普通文件,不是 txt。

如果这是 100% 倒退,我深表歉意,我是 HTML 和一般网络编程的新手 :)

【问题讨论】:

  • 你得到什么错误? (请注意,您首先打开 brightness 进行读取 - 然后写入 brightness.txt - 它不是同一个文件)
  • 您希望获得什么价值?
  • 编辑:忽略。我将再次尝试修复 h2oooooooo 指出的错误
  • 您运行代码,如果出现错误,您将在 PHP/webserver 错误日志中得到它(以及错误 500),或者您会在页面本身上看到它。您可以通过使用 error_reporting(E_ALL) 作为代码中的第一件事来强制错误。
  • $f = fopen("/sys/class/leds/led0/brightness", "r");需要 $f = fopen("/sys/class/leds/led0/brightness.txt", "r"); .您可以打开txt文件并检查您需要更改的值。

标签: php html raspbian


【解决方案1】:

由于您在 rasp 上没有太多内存,我假设您将它与 nginx+php-fpm 一起使用,而不是与缓慢而沉重的 Apache 一起使用。使用 php-fpm,您可以轻松地由其所有者运行 PHP 脚本,因此您只需将脚本所有者更改为 root,确保脚本有效(安全!),然后您可以编写任何您想要的文件。

chown root:www-data <script that writes to sys file>

<?php
exec('echo ' . intval($value) . ' > /sys/class/leds/led0/brightness');

【讨论】:

  • 我正在运行 apache,有没有办法用 apache 做到这一点?
  • php-fpm / fastcgi / fcgi / suexec 也可用于 apache。但是 nginx 确实更好,更容易配置,快 3 倍,资源更少..