1

我正在使用 LD_PRELOAD,并且在使用 system() 命令时看到了 bash 和 dash 之间的区别。

让我们考虑这个简单的 C 程序:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) { 
    system("echo $LD_PRELOAD > /tmp/blah.txt");
    return 0;
}

我会像这样开始我的测试程序:

LD_PRELOAD=preload.so ./test

在 bash 和 dash 中,我得到了:

~$ cat /tmp/blah.txt 
 preload.so

到目前为止一切都很好,除了当 dash 是 shell 时 LD_PRELOAD 不应用于给系统的命令。我是说

  • 如果 /bin/sh 指向 /bin/bash,则 LD_PRELOAD 应用于给 system() 的命令
  • 如果 /bin/sh 指向 /bin/dash,则 LD_PRELOAD 不会应用于给 system() 的命令。

我的 preload.so 库覆盖 open()。它在使用 bash 时与测试程序一起执行(/bin/sh=/bin/bash),但在使用 dash 时不执行(/bin/sh=/bin/dash)。

我猜 bash 和 dash 可能会以不同的方式处理传递给 execve 的环境变量,但我找不到用 dash 将 LD_PRELOAD 应用于给系统的命令的方法......不幸的是,我必须使用 dash,而使用 bash 是不是一个选择。

4

0 回答 0