system(3) で呼び出されたサブシェルに LD_LIBRARY_PATH 環境変数がありません。

system(3) で呼び出されたサブシェルに LD_LIBRARY_PATH 環境変数がありません。

我々は、次のユーザー要求に応じて出力を印刷する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

おすすめ記事