system(3) 调用的子 shell 中缺少 LD_LIBRARY_PATH 环境变量

system(3) 调用的子 shell 中缺少 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 以 root 身份启动(即每天早上刷新)。

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生成的子进程。

相关内容