以 root 身份从 php 运行 bash 脚本的问题

以 root 身份从 php 运行 bash 脚本的问题

我正在制作一个 php 面板,您可以在其中在服务器上安装 owncloud 和 plex 等应用程序。我创建了多个用于安装和删除软件的 bash 脚本。我从 shell 测试了所有这些,一切正常。但是,当我在 ubuntu 15.10 上使用 sudo 以 root 身份从 php 运行脚本时,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

当我直接从 bash 运行 appinstaller 时,一切正常。

当我使用 php 运行 appinstaller 时(确认脚本以 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 会话吗?

答案1

以 root 身份运行 PHP 脚本是一种危险的做法。 Web 服务器尽最大努力防止权限升级,并实施各种措施,例如chroot监狱。我相信这可能是您出现问题的原因。

特别是,dpkg需要访问文件才能/var/lib/dpkg/正常运行。您可以检查您是否有权从 PHP 脚本访问此目录,例如尝试列出其中的文件,或从/var/lib/dpkg/status.如果你不这样做(即使以 root 身份运行),那么你确实进了监狱。你当然可以禁用监狱(如何做到这一点取决于网络服务器),但我不推荐它。实施它是有原因的,规避安全机制会让您面临各种攻击。

相关内容