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

1

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

Однако, когда я запускаю свой 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)
  • 0
    Эти sudo могут запрашивать пароль. PHP не отправляет никаких входных данных, поэтому он просто сидит там.
  • 0
    @ RocketHazmat хм, но когда я вручную набираю эти команды без скрипта, но с sudo, это работает. Хорошо, но скажите, что требуется пароль, как мне разобрать пароль через php?
Теги:
raspberry-pi

4 ответа

1
Лучший ответ

Благодаря @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)
1

Недавно я опубликовал проект, который позволяет 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) Вы передаете корневые учетные данные объекту каждый раз, когда вам нужна оболочка с корневой установкой.

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

0

Попробуйте использовать свой скрипт с 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/...

  • 0
    где я могу поставить эту строку? #!/usr/bin/php -ddisplay_errors=E_ALL ? окно командной #!/usr/bin/php -ddisplay_errors=E_ALL терминала или мой скрипт или файл php?
  • 0
    я думаю, что я испытываю сломанный канал, как после того, как моя команда сценария bash 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 и не заканчивается на $ как это должно быть в обычном режиме выполнение
Показать ещё 7 комментариев
0

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

  • SUID ваши shell-скрипты, которые запускаются с помощью sudo
  • и убедитесь, что все в порядке с текущим каталогом (и PATH) для вашего PHP-скрипта.
  • 0
    я не получаю часть SUID, что если я установил permision 777 в файл? мне все еще нужен SUID?
  • 0
    @peekaboo Этот вопрос superuser.com/questions/440363/… я проясню, я полагаю
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню