Как гласит название, когда я пытаюсь выполнить скрипт вручную, дважды щелкнув и нажав выполнить через терминал. Он работает правильно
Однако, когда я запускаю свой 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) Вы передаете корневые учетные данные объекту каждый раз, когда вам нужна оболочка с корневой установкой.
Выбрать свой яд. :) Прочитайте документацию.
Попробуйте использовать свой скрипт с 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()
Я нашел интересную ссылку, в которой рассматривается проблема, которая несколько похожа на вашу qaru.site/questions/202020/...
#!/usr/bin/php -ddisplay_errors=E_ALL
? окно командной #!/usr/bin/php -ddisplay_errors=E_ALL
терминала или мой скрипт или файл php?
cmd_start_cam.sh: line 12: echo: write error: Broken Pipe
echo 'complete start camera script'
команду echo 'complete start camera script'
вывод терминала cmd_start_cam.sh: line 12: echo: write error: Broken Pipe
и не заканчивается на $
как это должно быть в обычном режиме выполнение
Вы должны либо проверить:
sudo
PATH
) для вашего PHP-скрипта.
sudo
могут запрашивать пароль. PHP не отправляет никаких входных данных, поэтому он просто сидит там.