我有应用程序,在运行时生成有趣的中间输出到./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更加智能化。
想到两个想法:
您可以尝试将不可变标志添加到目录中。 +我
chattr +我/path/到/文件/ *
如果程序是脚本,请取消该用户的rm命令链接。 为rm创build一个别名“什么也不做”的别名:
别名rm ='echo'
我认为第一个会阻止文件被删除,但不会自动发生。 第二个将阻止应用程序删除任何文件,至less使用RM命令。 如果它正在使用文件系统调用,那么你将很难用这种方法来防止删除。