[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 メーリングリストの案内