Я делаю php-панель, из которой вы можете установить такие приложения, как owncloud & plex на вашем сервере. Я создал несколько скриптов bash, которые устанавливают и удаляют программное обеспечение. Я протестировал их все из shell, все работает как надо. Однако когда я запускаю скрипты из php от имени root с помощью sudo на ubuntu 15.10, apt-get и dpkg не работают так, как должны.
В visudo у меня есть:
seedbox ALL = (root) NOPASSWD: /bin/appinstaller
appinstaller - это bash скрипт, который запускает bash скрипты установки/удаления приложений (например, appinstaller plex)
Пример скрипта Plex:
dpkg --configure -a
cd /tmp
wget https://downloads.plex.tv/plex-media-server/0.9.15.6.1714-7be11e1/plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb
dpkg -i plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb
Когда я запускаю appinstaller прямо из bash, все работает отлично.
Когда я запускаю appinstaller из php (подтверждено, что скрипт запущен от имени root):
exec("sudo /bin/appinstaller plex > /home/installer.log 2>&1 &");
Он работает, но я получаю ошибки apt & dpkg, когда пытаюсь установить другие приложения, например:
E: Пакет plexmediaserver должен быть переустановлен, но я не могу найти архив для него. (хотя он установлен и работает)
А также dpkg --configure -a
выдает ошибку.
Plex работает нормально, но похоже, что apt не завершает процесс установки и где-то застревает, также команды, запущенные после apt-get install
/dpkg
не запускаются из php, но запускаются из bash. Я пытался запустить скрипт также из cron & systemctl и получил ту же проблему.
Стоит отметить, что некоторые приложения устанавливаются/удаляются без каких-либо проблем.
В чем может быть разница между запуском скрипта из php/cron/systemctl или из shell напрямую? Могу ли я эмулировать нормальную сессию bash?
Запуск PHP-скриптов от имени root - опасная практика. Веб-серверы делают все возможное, чтобы предотвратить повышение привилегий, и применяют различные меры, такие как chroot jail. Я считаю, что это может быть причиной ваших проблем.
В частности, dpkg
нуждается в доступе к файлам в /var/lib/dpkg/
, чтобы нормально функционировать. Вы можете проверить, есть ли у вас доступ к этому каталогу из ваших PHP скриптов, например, попытавшись перечислить файлы в нем, или прочитать из /var/lib/dpkg/status
. Если вы этого не делаете (даже при запуске от имени root), значит, вы действительно находитесь в тюрьме. Конечно, вы можете просто отключить jail (как это сделать, зависит от веб-сервера), но я бы не рекомендовал этого делать. Есть причина, по которой это было сделано, и обход механизмов безопасности подвергает вас всевозможным атакам.