我们有一个巨大的客户端服务器业务应用程序,该服务器是用 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
生成的子进程。