Выполнение скрипта bash через PhP дает другой результат по сравнению с выполнением вручную

Как гласит название, когда я пытаюсь выполнить скрипт вручную, дважды щелкнув и нажав выполнить через терминал. Он работает правильно

Однако, когда я запускаю свой 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.

  1. Инструкции по резервному копированию и редактированию файла sudoers: http://raspbypi.com/enabling-the-sudo-command-for-a-new-user/
  2. sudo visudo
  3. добавьте это в конец файла www-data ALL = (ALL) NOPASSWD: ALL
  4. Нажмите CTRL + X и нажмите да.
  5. войдите в систему и выйдите из системы, чтобы обеспечить разрешение.
  6. Если ваш файл sudoer поврежден: введите это в окне терминала, чтобы исправить любой текст, который вы набрали неправильно. 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.

  1. Инструкции по резервному копированию и редактированию файла sudoers: http://raspbypi.com/enabling-the-sudo-command-for-a-new-user/
  2. sudo visudo
  3. добавьте это в конец файла www-data ALL = (ALL) NOPASSWD: ALL
  4. Нажмите CTRL + X и нажмите да.
  5. войдите в систему и выйдите из системы, чтобы обеспечить разрешение.
  6. Если ваш файл sudoer поврежден: введите это в окне терминала, чтобы исправить любой текст, который вы набрали неправильно. 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) Вы передаете корневые учетные данные объекту каждый раз, когда вам нужна оболочка с корневой установкой.

Выбрать свой яд. 🙂 Прочитайте документацию.

Вы должны либо проверить:

  • SUID ваши shell-скрипты, которые запускаются с помощью 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