[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:04322] Re: LD_LIBRARY_PATHが継承されない



池田@仙台です。

# 後から気がついたのですが、Slackware/RedHatの違いは、shadow passwd付属の
# suとGNU shell util 付属の su の違いではないか、と思い当たりました。
# http://www.linux.or.jp/JM/html/GNU_sh-utils/man1/su.1.html
# http://www.linux.or.jp/JM/html/shadow/man1/su.1.html
## ソース内部までは見ていません。ごめんなさい。

From: KOJIMA Mitsuhiro <kojima@criepi.denken.or.jp>
Subject: [plamo:04312] Re: LD_LIBRARY_PATHが継承されない
Date: Sat, 6 Nov 1999 11:35:33 +0900
Message-ID: <19991106112739A.kojima@criepi.denken.or.jp>

> > # おかげで、他のディストリビューションに移行した人から、
> > # 「shutdownがcommand not foundになります」というのがFAQに
> > # なりましたよね?
> > 
> 
> これはあまり聞いたこと無かったけど、どういう症状でしょう?

つまらないことなのですが、RedHat系で、引数なしでsuを実行すると
PATHが継承されます。このため、「一度ログアウトしてからrootで
ログインし直さないとshutdownできないけどどうして?」といった類の
質問をよく見かけました。
# もちろん答えは「フルパスで実行するか、"su -"を使え 」です;)
「Slackwareから移行した」と書いてある場合もありましたし、
そうでないこともありましたが、参考にした文書がSlackwareを
前提に書いてあった影響もあるんじゃないかと憶測してます。


...だけでは、なにやら申し訳ないので、shadow-980403のソースを
見てみました。

> # shadow passwd suits に付属の su のソースはざっと眺めてみて、PATH が
> # 変更されることは確認したんだけど、LD_LIBRARY_PATH は特に明示的には変
> # 更していないみたい。

src/su.c の main()直後に sanitize_env();(実体はlibmisc/env.c)という
関数がありまして、この中で

static char * const forbid[] = {
        "ENV=",
        "BASH_ENV=",    /* GNU creeping featurism strikes again... */
        "HOME=",
        "IFS=",
        "LD_",          /* anything with the LD_ prefix */
        "PATH=",
        "SHELL=",
        "_RLD_=",
        "SHLIB_PATH=",
        "LIBPATH=",
        "KRB_CONF=",
        "MAIL=",
        (char *) 0
};

の環境変数が消去されているようです。

つまり、shadow passwd 付属の su を使っている限り、LD_*は継承され
ません。元の質問者の方への解答としては、LD_*を継承する特製suを
つくる(libmisc/env.cの一行を消去するだけ)か、おそらくはGNU shell
 utilのsuを使うことで解決する、ということになると思います。
-- 
――――――――――――――――――――――――
東北大学情報科学研究科  情報応用数理学III
   池田光太郎   kota@cmm.is.tohoku.ac.jp
――――――――――――――――――――――――

Follow-Ups
[plamo:04326] Re: LD_LIBRARY_PATHが継承されない, Michihide Hotta
References
[plamo:04312] Re: LD_LIBRARY_PATHが継承されない, KOJIMA Mitsuhiro

[検索ページ] [メール一覧]
Plamo ML 公開システム