phpのsystem()で呼び出されたコマンドの環境変数に注意


phpから外部コマンドを実行する、system()関数やshell_exec()関数で呼び出される外部コマンド内の環境変数には注意しましょう。

たとえば。

$ sudo /etc/init.d/httpd restart

のようにノーマルユーザーでsudoを使ってhttpdを再起動した場合と、

$ su -
# /etc/init.d/httpd restart

のようにsuコマンドでrootに変わった後でhttpdを再起動した場合では、環境変数の値が変わります。

具体的には、sudoで再起動した場合にはsudoを行ったときのユーザーの環境変数が、rootで再起動した場合にはrootユーザーの環境変数が使用されます。

ややっこしいのは、外部コマンド自体はapacheやnobodyなどhttpd.confで指定された権限で動作しますので、実行ユーザーと環境変数が違うユーザーのものになるようです。

実際に私自身SubversionのWEBインターフェースなどを作っていて、いつのまにやら動作しないなんてことになって困ったことがあります。

perlで汚染チェックモードで開発すると分かりますが、意外と突拍子もないところで環境変数が使われたりするので、外部コマンドを使用する場合は、外部コマンド側で環境変数を使用しないようにしましょう。

どうしても、環境変数をあてにしたい場合は、以下のようにphp側で環境変数をexportしてやれば期待通りの環境変数が確実に渡せます。

<?php
$cmd = 'export PATH="/usr/local/bin/"; command ......";
echo "<pre>".shell_exec($cmd)."</pre>";
?>

システムコマンドは、安易に使用しないのがベターなのですが、使用する場合は要注意です。


関連する記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>