私はサーバーにowncloudやplexなどのアプリケーションをインストールできるPHPパネルを作成しています。ソフトウェアをインストールおよび削除するためのいくつかのbashスクリプトを作成しました。私はこれらすべてをシェルでテストし、すべてがうまくいきました。しかし、Ubuntu 15.10でrootとしてsudoを使用してPHPでスクリプトを実行すると、apt-getとdpkgは機能しません。
Visudoには次のものがあります。
seedbox ALL = (root) NOPASSWD: /bin/appinstaller
appinstaller は、アプリケーションのインストールと削除の bash スクリプト (appinstaller plex など) の実行に使用される bash スクリプトです。
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でスクリプトを実行することとシェルで直接実行することの違いは何ですか?一般的なbashセッションをシミュレートできますか?
答え1
PHPスクリプトをrootとして実行するのは危険な習慣です。 Web サーバーは、特権の昇格を防止し、次のようなさまざまなアクションを実装するために最善を尽くします。chroot 刑務所。私はこれがあなたの問題の原因であると信じています。
特に、正しく機能するdpkg
にはファイルへのアクセスが必要です/var/lib/dpkg/
。たとえば、PHPスクリプトでファイルのリストを試して、このディレクトリにアクセスする権限があることを確認できます/var/lib/dpkg/status
。そうでない場合(ルートで実行しても)実際に刑務所にいるのです。もちろん、刑務所を無効にすることはできますが(これを行う方法はWebサーバーによって異なります)、お勧めしません。セキュリティメカニズムをバイパスすると、さまざまな攻撃にさらされる理由があります。