我々は、次のユーザー要求に応じて出力を印刷するCで書かれた巨大なクライアントサーバービジネスアプリケーションを持っています。
system("/usr/local/sisis-pap/cups/bin/lpr ....");
上記のlpr
コマンドは共有ライブラリを必要とし、動的ローダがそのライブラリを見つける場所を知るために、LD_LIBRARY_PATH
環境変数を介してそのライブラリにアクセスします。ld-linux.so
環境変数があります。つまり、次のようになります。
p = getenv("LD_LIBRARY_PATH");
printf("LD_LIBRARY_PATH env [%s]\n", p==NULL?"":p);
system("env | grep LD_LIBRARY_PATH");
うまく印刷されますが、サブシェルでは失われます。
正確に言うと、これはアプリケーションの下の例に過ぎず、問題を調査するために不足している環境変数をシミュレートするために特別に書かれた小さなC-pgmを使用することはできません。アプリケーションはcronを介してルートとして起動されます(つまり、毎朝更新されます)。
LinuxはSuSE SLES15です。
LD_LIBRARY_PATH
何が消えるのか知っていますかsystem(3)
?マニュアルページにはそのような内容は記載されていません。
ベストアンサー1
このCコードをコンパイルして実行すると、問題を再現できますroot
。
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char *p;
p = getenv("LD_LIBRARY_PATH");
printf("getenv(): LD_LIBRARY_PATH env [%s]\n", p==NULL?"":p);
seteuid(900118);
printf("effective uid now %d\n", geteuid());
system("echo LD_LIBRARY_PATH in child: ; env | grep LD_LIBRARY_PATH");
exit(0);
}
sysseteuid()
呼び出しは、アプリケーションサーバーがいわゆるプロセスで実行されるようにして、生成された子プロセスをsecure-execution mode
削除します。LD_LIBRARY_PATH