[Armadillo:03580] Re: lighttpdでcommand not foundになる
林田 平馬
email@hidden
2008年 10月 23日 (木) 17:53:20 JST
竹之下様
お世話になっております。
林田です。
報告させていただいた問題は、ご指摘いただいた現象で間違いないと思います。
こちらでつかんでおりました現象ともピタリと一致します。
特にsudoが認識される点が気になっておりましたが、頭の中でガリレオの音楽
が流れ見事にスッキリいたしました。ありがとうございました。
ただ、完全な解決はソースをいじる必要があるようですので、どうするか慎重に
検討したいと思います。ちなみに、まだソースを見てないのですがfork/execve部分
の修正は竹之下様的には大手術にみえますでしょうか?ひどい質問ですいません。
見られた感じの直感でもいただけると助かります。
settimeofday()の件ですが、申し遅れましたが、以前にメーリングリストで
拝見させていただいており
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main(int argc, char *argv[])
{
struct timezone tz = {0, 0};
tzset();
settimeofday(NULL, &tz);
tz.tz_minuteswest = timezone / 60;
settimeofday(NULL, &tz);
return 0;
}
という感じでコマンド化し、rcスクリプトの中でntpcliant又はhwclock -s実行後に
呼んでおります。cgiの中でも呼ぶようにsystemコマンドを利用した場合と、直接
埋め込んだ場合を試しましたが、どちらもこれまでの報告同様、lighttpdでは
UTC時間となります。私の勘ですが、先の環境変数の問題を解決すると時間
の方も解決するのではと期待しております。
大切なお時間割いていただきありがとうございました。
また何か、私の手におえない問題がありましたら、こちらのメーリングリストを
通じてご相談させてください。よろしくお願いいたします。
> 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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
armadillo メーリングリストの案内