我正在制作一个 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 身份运行),那么你确实进了监狱。你当然可以禁用监狱(如何做到这一点取决于网络服务器),但我不推荐它。实施它是有原因的,规避安全机制会让您面临各种攻击。