我有在运行时生成有趣的中间输出到 ./tmp 目录的应用程序。
在执行结束时,该目录被删除。
我怎样才能保留它的内容?
我在系统上没有 uid 0。
因此,我无法拦截(阻止取消链接)任何 I/O 操作。
目前我正在停止这个应用程序和它的cp内容。
应用程序是为此静态编译的共享库 + LD_PRELOAD 无济于事。应用程序正在使用与任何环境变量无关的 **./**tmp 文件夹。
感谢您的回复。
Dav*_*ley 10
它可以使用 TMPDIR 或 TEMPDIR 环境变量的值。您可以尝试将其设置为不同的目录,然后查看程序是否使用该目录。也许这是一个配置设置。
如果您能够以非 root 用户身份删除 /tmp 目录或其中的所有内容,那么您的权限似乎是错误的。
我对系统的权限是:
drwxr-xr-x 26 root root 4096 2009-10-14 12:00 /
drwxrwxrwt 27 root root 12288 2009-10-19 16:10 /tmp
Run Code Online (Sandbox Code Playgroud)
/ 目录只允许 root 删除顶级目录,而 /tmp 上的粘性位只允许所有者删除他们自己在 /tmp 中的文件。显然,您需要 root 来纠正这些问题。
假设它使用 unlink 功能删除文件,您可以创建一个预加载的小型共享库,它会覆盖系统 unlink 功能。
创建 unlink.c 包含:
int unlink(const char *pathname) {
return 0;
}
int unlinkat(int dirfd, const char *pathname, int flags) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们也覆盖 unlinkat 函数以防它使用它。您现在可以运行:
% gcc unlink.c --shared -o unlink.so
% file unlink.so
unlink.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, not stripped
% touch foo
% LD_PRELOAD=./unlink.so rm foo
% ls foo
foo
Run Code Online (Sandbox Code Playgroud)
如果您发现您的程序需要删除其他文件,您可以让您的替换功能更加智能,例如检查要求删除的路径。