阻止应用程序的 rm -rf

use*_*364 3 unix rm

我有在运行时生成有趣的中间输出到 ./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)

如果您发现您的程序需要删除其他文件,您可以让您的替换功能更加智能,例如检查要求删除的路径。