[Armadillo:03579] Re: lighttpdでcommand not foundになる
Takenoshita Koyo
email@hidden
2008年 10月 23日 (木) 16:11:14 JST
1. シェルコマンドの実行(system関数で呼び出すとcommand not foundになる)
<原因>
lighttpdが、cgiを実行するときに、fork/execveするのですが、
その際に環境変数を全て設定し直しており、
設定し直した環境変数にはPATHが含まれていないため。
<対処>
絶対パスの記述に変更するか、
lighttpdのfork/execve部分を修正して、環境変数のPATHを引き継ぐように修正する必要があると思います。
<現象の確認>
overview_display.cのdisplay_overview()関数に下記を追加して、index.cgiを実行します。
system("env > /tmp/at-admin/www-data-env");
system("sudo /bin/env > /tmp/at-admin/root-env");
すると、下記のようになります。
[email@hidden (ttyAM0) /home/www-data]# su www-data
[email@hidden (ttyAM0) ~]$ env (www-dataの環境変数)
USER=www-data
(中略)
PATH=/bin:/usr/bin:/sbin:/usr/sbin
HISTSIZE=1000
SHELL=/bin/ash
PWD=/home/www-data
TZ=JST-9
EDITOR=vi
[email@hidden (ttyAM0) ~]$ cat /tmp/at-admin/www-data-env (index.cgiの環境変数)
GATEWAY_INTERFACE=CGI/1.1
HTTP_ACCEPT_CHARSET=Shift_JIS,utf-8;q=0.7,*;q=0.7
(中略)
SERVER_PORT=80
SCRIPT_NAME=/index.cgi
SERVER_NAME=172.16.2.180
[email@hidden (ttyAM0) ~]$ cat /tmp/at-admin/root-env (sudoしたあとの環境変数)
[email@hidden (ttyAM0) ~]$
www-dataの環境変数と、cgiでsysytem("env")したときの環境変数が異なっています。
sudoしたあとの環境変数に至っては、空っぽです。
lighttpdでは、cgiを実行する際、for/execveしますが、
その時に環境変数を全て設定しなおしています[*1]。
manページ[*2]によると、sudoは、環境変数PATHを引き継いで、指定されたコマンドを実行しますが、
lighttpdによって環境変数からPATHが取り除かれているため、引き継ぐものがなく、PATHが空になり
コマンドが見つからない。という状況のようです。
では、なぜsysytem()関数はsudoを見付けることができるのかというと、
system()関数は、指定されたコマンドを実行する際、先頭に"/bin/sh -c"をつけるから[*3]のようです。
まとめると、環境変数が以下のように変化しています。
実行しているプロセス(ユーザ): 環境変数
---------------------------------------------------------------------------
lighttpd(www-data): www-dataの環境変数
index.cgi(www-data): lighttpdが設定した環境変数(/tmp/at-admin/www-data-env)
sudo env(www-data): lighttpdが設定した環境変数(/tmp/at-admin/www-data-env)
env(root): 環境変数は空(sudoで引き継ぐものがなかったため)
[*1] atmark-dist/user/lighttpd/src/mod_cgi.c
[*2] http://www.linux.or.jp/JM/html/sudo/man8/sudo.8.html
「しかし、実際の環境変数 PATHは修正されず、そのまま sudo が実行するプログラムに渡されることに注意すること。」
[*3] http://www.linux.or.jp/JM/html/LDP_man-pages/man3/system.3.html
2. 時間取得(UTC時間になる)
こちらは、settimeofday()を実行するとどうなりますか?
http://lists.atmark-techno.com/pipermail/armadillo/2006-November/001365.html
--
Koyo Takenoshita
armadillo メーリングリストの案内