У меня маленькая проблема. Когда я набираю PHP на моей машине Raspberry Pi, это:
system("echo hello");
Он печатает на веб-странице. Зачем? Почему он не печатает в терминал?
Я не видел это на моей замазке.
Большое спасибо.
Там нет проблем с system
, Эта функция возвращает все выполненные программы, напечатанные на stdout
, В данном случае это «привет».
wall
напечатать всемКак предположил Джейсен, вы можете использовать wall
распечатать его всем, кто пользуется системой. Это полезно, если вы не знаете номер tty, но отображает баннер для терминала, если вы не запускаете его как root.
system("echo test | wall");
Чтобы печатать вручную, без баннера и рута, вы можете добавить пользователя вашего сервера Apache в tty
группа, вот так: (заменить пользователя)
sudo usermod -a -G tty WEB_SERVER_USER
Тогда вы могли бы сделать что-то вроде этого:
system("your command > /dev/pts/0");
или же
$output = system("your command");
file_put_contents('/dev/pts/0', $output);
Это, конечно, предполагает, что ваш терминал сопоставлен с /dev/pts/0
, ls /dev/pts/
чтобы увидеть список.
stderr
В дополнение к вышесказанному, если ваша программа выводит stderr
нужно прикрепить 2>&1
в конце вашей команды, например:
system("your_command 2>&1 | wall");
Это перенаправит оба потока.
Вы также можете запустить свой скрипт в терминале, используя php-cli. Чтобы установить cli, используйте:
sudo apt-get install php5-cli
Затем в вашем скрипте вы можете использовать echo system("your_command 2>&1");
и запустить его в терминале:
php script.php
это потому, что в веб-контексте stdout — это результат, возвращаемый браузеру
если вы хотите писать в терминалы вошедших в систему пользователей
$wall=popen("wall","w");
fwrite($wall,"Hello!\n");
pclose($wall);
у них должно быть включено «сообщение». (Я думаю, это по умолчанию)
команда mesg y
включит его, man mesg
для получения дополнительной информации.
Системная функция не выполняет команду в любом подключенном tty, поэтому не вижу никакого вывода в tty, присоединенном к вашему сеансу Putty.
Если вы хотите отправлять команды на контакты GPIO в Pi через PHP, вы можете использовать системную функцию для таких вещей, как: system("echo 1 > /sys/class/gpio/xyz)
но имейте в виду, что php должен запускаться с правами суперпользователя, что не по умолчанию на веб-сервере Apache.