Как гласит название, когда я пытаюсь выполнить скрипт вручную, дважды щелкнув и нажав выполнить через терминал. Он работает правильно
Однако, когда я запускаю свой php-скрипт или вводя php в окно терминала
/usr/bin/php start_cam.php
Он блокируется (команда не заканчивается с «$», «$» не отображается в окне терминала, чтобы показать, что она закончила задачу, и она работает неправильно
Ниже приведен сценарий php
<?php $command =escapeshellcmd("/bin/bash cmd_start_cam.sh"); $output = shell_exec($command); echo $output; echo "php_startcam2"; ?>
Ниже приведен мой сценарий bash (cmd_start_cam.sh)
!/bin/bash echo 'running start camera script' cd sudo chmod 755 /etc/rc.local cd cd RPi_Cam_Web_Interface sudo chmod u+x RPi_Cam_Web_Interface_Installer.sh sudo ./RPi_Cam_Web_Interface_Installer.sh stop sudo ./RPi_Cam_Web_Interface_Installer.sh start echo 'complete start camera script'
Примечание. Я использую cd для обеспечения im в моем корневом каталоге, где есть файлы. Как он работает через ручное исполнение, не думайте, что там проблема? Любая помощь приветствуется. Спасибо
Обновление: это ошибка, возникающая при выходе из окна командной строки терминала:
я думаю, что испытываю прерывистую трубу, так как после моего скрипта bash команду echo 'complete start camera script'
вывод оконного окна cmd_start_cam.sh: line 12: echo: write error: Broken Pipe
и не заканчивается на $
как это должно при нормальном выполнении
Кстати, это работает на малине pi 2
Обновление исправлено / Решение:
Благодаря @ikra проницательность при проверке файла журнала Apache, который заставляет меня обнаружить, что основной причиной был доступ к разрешению. www-data необходимо добавить в файл sudoers.
pkexec visudo
. (Источник: https://askubuntu.com/questions/73864/how-to-modify-a-invalid-etc- sudoers-file-it-throws-out-an-error-and-not-allowi ) Благодаря @ikra проницательность при проверке файла журнала Apache, который заставляет меня обнаружить, что основной причиной был доступ к разрешению. www-data необходимо добавить в файл sudoers.
pkexec visudo
. (Источник: https://askubuntu.com/questions/73864/how-to-modify-a-invalid-etc- sudoers-file-it-throws-out-an-error-and-not-allowi ) Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash (по запросу root), она решает ограничения exec () и shell_exec (). Получить его здесь: https://github.com/merlinthemagic/MTS
После загрузки вы просто используете следующий код:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); $return1 = $shell->exeCmd('php start_cam.php'); //the return will be a string containing the return of the command echo $return1;
Вы можете поддерживать скрипт bash и просто запускать его, как в моем примере. Однако, увидев, что сценарий представляет собой просто команду bash, почему бы не запускать их непосредственно в оболочку, таким образом вы можете обрабатывать возврат и любые исключения.
Что касается безопасности, это намного лучше, чем запуск apache в виде root или широкие открытые разрешения sudo, которые вы перечисляете в своем обновлении решения. Но позволить PHP где-нибудь рядом с корнем всегда сложно.
Проект, который я построил, обеспечивает корневую оболочку bash одним из двух способов:
1) Вы разрешаете apache право sudo python.
ИЛИ
2) Вы передаете корневые учетные данные объекту каждый раз, когда вам нужна оболочка с корневой установкой.
Выбрать свой яд. 🙂 Прочитайте документацию.
Вы должны либо проверить:
sudo
PATH
) для вашего PHP-скрипта. Попробуйте использовать свой скрипт с php-cli и сначала поместите эту строку, чтобы увидеть, что происходит.
#!/usr/bin/php -ddisplay_errors=E_ALL
Делать
chmod 700 myscript.php
и запустить его таким образом
$ ./myscript.php
Если вы хотите запустить его под сервером apache, просто вставьте эту функцию после открытия php-тега:
error_reporting(E_ALL);
будет делать то же самое.
Чтобы передать пароль команде sudo, используйте команду sudo -S *command* < <(echo -e "*pass*\n")
в вашей оболочке скрипта. Однако это плохая идея, потому что каждый, кто может получить доступ к вашему скрипту, может получить ваш пароль.
Я думаю, ваш скрипт запускает вашу камеру, если sudo ./RPi_Cam_Web_Interface_Installer.sh start
– это ресурс потока, то проблема в том, что shell_exec(./myscript.sh)
имеет ограниченное значение буфера, поэтому он не может обрабатывать ответ вашего оболочка сценария.
Попробуйте использовать popen()
вместо shell_exec()
Я нашел интересную ссылку, в которой рассматривается проблема, которая несколько похожа на вашу https://stackoverflow.com/a/20109859/5280812