阻止应用程序的rm -rf

我有应用程序,在运行时生成有趣的中间输出到./tmp目录。
在执行结束时,这个目录被删除
我怎样才能保存它的内容?

我没有在系统上的uid 0。
因此,我不能拦截(阻止取消链接)任何I / O操作。
目前我正在停止这个应用程序和它的内容。

应用程序为静态编译共享库+ LD​​_PRELOAD不会帮助。 应用程序正在使用** ./ ** tmp文件夹,它与任何envvariables都没有关系。

感谢您的答复。

它可以使用TMPDIR或TEMPDIR环境variables的值。 您可以尝试将其设置为不同的目录,并查看该程序是否使用该目录。 也许这是一个configuration设置。

如果你能删除/ tmp目录或其中的所有内容,作为非root用户,那么你的权限似乎是错误的。

我在我的系统上拥有的权限是:

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中删除自己的文件。 显然,你需要根源来纠正这些问题。

假设它使用取消链接function删除文件,您可以创build一个预先载入的小型共享库,这将覆盖系统取消链接function。

创buildunlink.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 

如果您发现您的程序需要删除其他文件,则可以通过例如检查要求删除的path来使您的replacefunction更加智能化。

想到两个想法:

  1. 您可以尝试将不可变标志添加到目录中。 +我

    chattr +我/path/到/文件/ *

  2. 如果程序是脚本,请取消该用户的rm命令链接。 为rm创build一个别名“什么也不做”的别名:

    别名rm ='echo'

我认为第一个会阻止文件被删除,但不会自动发生。 第二个将阻止应用程序删除任何文件,至less使用RM命令。 如果它正在使用文件系统调用,那么你将很难用这种方法来防止删除。