我正在使用 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 是不是一个选择。