在 Unix 中,我可以拥有一个我无法读取的文件吗?
如果是的话,我该怎么做?
答案1
答案是肯定的,您可以取消设置文件的读取标志。但作为所有者,您(以及以您的权限运行的程序)可以再次设置该标志。但对于不会自动执行此操作的程序,您可以通过这种方式禁止读取访问。
答案2
假设你的文件被调用file_name
,尝试
chmod a-r file_name
答案3
这可能无法以可移植的方式实现(POSIX)。但是,如果您运行的是 Solaris 10 或更新版本,这里有一种方法可以防止用户使用 dtrace 脚本持续设置给定文件的权限。
#!/usr/sbin/dtrace -qws
BEGIN {
userid=$1;
filename=$$2;
fullpath=$$3;
}
syscall::chmod:entry / strstr(copyinstr(arg0), filename) != NULL && uid == userid /
{
self->flag=1
}
syscall::chmod:return /self->flag/
{
system("chmod 0 %s;echo gotcha",fullpath);
}
您需要以 root 身份(或具有足够权限运行 dtrace 的用户)运行它,并将三个参数传递给脚本:目标用户 ID、要保护的文件的(基本)名称及其完整路径。
例如
# ./protect.d 53391 special /var/tmp/a/special &
在第二个窗口中,这里有一个显示 dtrace 脚本结果的示例会话:
$ id
uid=53391(jlliagre) gid=53391(jlliagre)
$ cd /var/tmp
$ ls -la a
total 12
drwxr-xr-x 2 jlliagre jlliagre 4 Sep 18 22:45 .
drwxrwxrwt 13 root sys 48 Sep 18 23:36 ..
---------- 1 jlliagre jlliagre 30 Sep 18 23:05 b
---------- 1 jlliagre jlliagre 30 Sep 18 23:05 special
$ cat a/b
cat: cannot open a/b
$ chmod a+r a/b
$ cat a/b
Tue Sep 18 23:05:39 CEST 2012
$ chmod a+r a/special
$ cat a/special
cat: cannot open a/special
当然,这是一种黑客行为,完全不能代表 dtrace 的设计初衷,而且肯定存在竞争条件和其他缺陷,因此并不完全可靠,但无论如何,它是一种实现您想要的方法。