#php #bash #shell #terminal #dpkg
#php #bash #оболочка #терминал #dpkg
Вопрос:
Пример PHP-скрипта выглядит следующим образом:
#!/usr/bin/php
$file = '/private/var/www/app/install.sh';
if(is_file($file)){
$output = shell_exec('bash /private/var/www/app/install.sh');
fwrite(STDOUT, $output."n");
}
exit(0);
install.sh Пример
#!/bin/bash
clear
echo "Executing Install Script..."
dpkg --info /private/var/www/app/app.deb
dpkg -i /private/var/www/app/app.deb
echo "Script Finished"
exit 0
При этом будут распечатаны результирующие данные dpkg —info, но не будет запущен dpkg -i. Он не выводит никаких ошибок или вообще ничего…
Кроме того, это выполняется через веб-браузер. Когда скрипт запускается с терминала, он работает нормально. Но в Интернете возвращается только команда info.
Комментарии:
1. Обратите внимание, что вы видите только стандартный вывод. Чтобы увидеть stderr, вам нужно перенаправить
shell_exec('bash /private/var/www/app/install.sh 2>amp;1');
Ответ №1:
Вероятно, есть некоторые проблемы с безопасностью в том, что вы пытаетесь здесь сделать, и я не собираюсь их комментировать. Однако, я бы предположил, что dpkg -i
это должно запускаться от имени root, и ваш веб-сервер (который выполняет install.sh скрипт) не запускается от имени root. С другой стороны, dpkg --info
команде не нужны привилегии root для запуска, и поэтому вы увидите ее вывод при выполнении через пользователя веб-сервера. Если вам действительно нужно запустить этот скрипт от имени root, вы можете захотеть взглянуть на конкретную /etc/sudoers
конфигурацию. Возможно, начать отсюда: https://help.ubuntu.com/community/Sudoers
и взгляните сюда: http://ubuntuforums.org/showthread.php?t=1132821
Комментарии:
1. Hola. Я попытался добавить «%wheel ALL = (ВСЕ) NOPASSWD: /usr/bin /dpkg %root ALL = (ВСЕ) NOPASSWD: /usr/ bin/ dpkg wheel ALL = (ВСЕ) NOPASSWD: / usr/ bin / dpkg root ALL = (ВСЕ) NOPASSWD: / usr/ bin / dpkg root ALL = (ВСЕ)», но не все сразу, а те комбинации, которые запускают его, когда я запускаю идентификатор команда от install.sh я понимаю это. Также я использую Lighttpd, а не apache. ‘uid= 0 (root) gid=0 (wheel) groups=0(wheel)’
2. Привет, вам нужно сопоставить запись /etc / sudoers с точным способом, которым вы будете выполнять команду. Способ, которым вы написали свой вопрос, выглядит так, как будто вы хотите выполнить sudo install.sh (что, в свою очередь, исключает dpkg …). Вы могли бы поместить
#!/usr/bin/env bash
в начало вашего установочного скрипта. Затем используйте /path/to/install.sh в файле sudoers. Что-то вроде:WEBSRV_USER ALL=(root)NOPASSWD: /p/to/install.sh
. Тогдаshell_exec('sudo /p/to/install.sh')
взгляните на вторую ссылку в моем ответе выше для получения более подробной информации. Кроме того, ознакомьтесь с соображениями безопасности, связанными с использованием этого подхода3. Во-первых, большое спасибо! Я последовал вашему совету и добавил #!/usr/bin /env bash в свой установочный скрипт и использовал visudo для корректного добавления нового правила для файла сценария. Затем с помощью shell_exec(‘sudo path/install.sh ‘) скрипт запущен, и все установлено! Выполняйте задание, сэр 🙂
4. С удовольствием, не стесняйтесь выбирать мой ответ, если он вас устраивает: D
Ответ №2:
dpkg --info
пока dpkg -i
не требуется разрешение root. Поскольку вы запускаете свой скрипт в браузере, это означает, что ваш скрипт выполняется на пользователе php / apache. Я полагаю, что при большинстве установок у этого пользователя нет прав root.
Чтобы преодолеть это, вы могли бы создать какой-то процессор, который будет иметь следующий шаг:
создать queue
таблицу:
- queue_id
- временная метка
- deb_file
- is_processed
скрипт браузера:
- после нажатия на install вставьте запись в таблицу queue.
скрипт процессора (допустим, queue_processor.php
):
- при запуске проверьте, есть ли записи в таблице очереди, is_processed = 0
- если есть какие:
- обновление is_processed = 1
- обработайте этот файл
- после завершения обработки (установки файла deb) установите is_processed = 2
Последний шаг заключается в том, чтобы установить queue_processor.php
на crontab и назначить его владельцем в качестве root:
* * * * * root /path/to/php/binary/php /path/to/your/queue_processor.php