我有一个应用程序在运行时会生成有趣的中间输出到 ./tmp 目录。
执行结束时,此目录为删除.
我怎样才能保存它的内容?
我在系统上没有 uid 0。
因此我无法拦截(阻止取消链接)任何 I/O 操作。
目前我正在停止此应用程序,并且cp它的内容。
应用程序是静态编译的,因此共享库 + LD_PRELOAD 不会有帮助。应用程序正在使用与任何环境变量无关的 **./**tmp 文件夹。
谢谢大家的回复。
答案1
它可能使用了 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
/ 目录仅允许 root 删除顶级目录,而 /tmp 上的粘性位仅允许所有者删除 /tmp 中的自己的文件。显然,您需要 root 才能纠正这些问题。
假设它使用取消链接功能来删除文件,您可以创建一个预加载的小型共享库,它将覆盖系统取消链接功能。
创建 unlink.c,包含以下内容:
int unlink(const char *pathname) {
return 0;
}
int unlinkat(int dirfd, const char *pathname, int flags) {
return 0;
}
我们还重写了 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
如果您发现您的程序需要删除其他文件,您可以使您的替换功能更加智能,例如,检查要求删除的路径。
答案2
我想到两个想法:
您可以尝试将不可变标志添加到目录。+ichattr +i /路径/到/文件/*如果程序是脚本,请取消此用户的 rm 命令链接。为 rm 创建一个“不执行任何操作”的别名:
别名 rm='echo'
我认为第一种方法可以防止文件被删除,但不会自动发生。第二种方法可以防止应用程序删除任何文件,至少使用 RM 命令。如果它使用文件系统调用,那么你将很难通过这种方式防止删除。