PHP запускает скрипт bash (.sh). dpkg —info работает, но не dpkg -i

#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