是否有一个文件始终存在并且“普通”用户无法访问它?

是否有一个文件始终存在并且“普通”用户无法访问它?

我需要这个来进行单元测试。有一个函数可以做到统计数据作为其参数传递的文件路径。我必须触发lstat失败的代码路径(因为代码覆盖率必须达到90%)

该测试只能在单个用户下运行,因此我想知道 Ubuntu 中是否有一个文件始终存在,但普通用户没有对其或其文件夹的读取权限。 (所以lstat除非以 root 身份执行,否则会失败。)

不存在的文件不是解决方案,因为它有一个单独的代码路径,我已经触发了。

编辑:仅缺乏对文件的读取访问权限是不够的。这样lstat仍然可以执行。我能够通过在 /root 中创建一个文件夹并在其中创建一个文件来触发它(在我具有 root 访问权限的本地计算机上)。并对该文件夹设置权限700。因此,我正在搜索只能由 root 访问的文件夹中的文件。

答案1

在现代 Linux 系统上,您应该能够使用/proc/1/fdinfo/0(id 1 进程的文件描述符 1 (stdout) 的信息(init在根 pid 命名空间中,应作为 运行root))。

您可以找到一个列表(作为普通用户):

sudo find /etc /dev /sys /proc -type f -print0 |
  perl -l -0ne 'print unless lstat'

-type f如果您不想限制为常规文件,请删除)。

/var/cache/ldconfig/aux-cache如果您只需要考虑 Ubuntu 系统,那么这是另一个潜在的候选者。它应该在大多数 GNU 系统上工作,因为只能通过GNU libc 附带的命令/var/cache/ldconfig创建读+写+可搜索到 root 。ldconfig

答案2

看着统计数据(2)手册页中,您可以获得一些可能导致失败并出现 ENOENT(文件不存在)以外的错误的情况的灵感。

最明显的是:

欧洲航空航天中心 路径前缀中的目录之一的搜索权限被拒绝小路

所以你需要一个无法搜索的目录。

是的,您可以寻找系统中已经存在的一个(也许/var/lib/private它存在?)但您也可以自己创建一个,相当于:

$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile

lstat(2) 操作将失败并出现 EACCES。 (从目录中删除所有权限可以确保这一点。也许您甚至不需要那么多权限,chmod -x删除执行权限就足够了,因为需要目录上的执行权限才能访问其下的文件。)

还有另一种使 lstat(2) 失败的创造性方法,请查看其手册页:

伊诺迪尔 路径前缀的组成部分小路不是目录。

因此,尝试访问诸如此类的文件/etc/passwd/nonexistent应该会触发此错误,这又与 ENOENT(“没有这样的文件或目录”)不同,并且可能适合您的需求。

另一种是:

埃纳图隆 小路太长。

但您可能需要一个非常长的名称(我相信 4,096 字节是典型的限制,但您的系统/文件系统可能有更长的名称。)

最后,很难说这些是否会是实际上对你有用。你说你想要一些不会触发“文件不存在”场景的东西。虽然这通常意味着 ENOENT 错误,但实际上许多更高级别的检查只会将 lstat(2) 中的任何错误解释为“不存在”。例如,test -e或者 shell 中的等效内容[ -e ...]可能只是将上述所有内容解释为“不存在”,特别是因为它没有一个好的方法来返回不同的错误消息,并且不返回错误将意味着该文件存在,但事实显然并非如此。

答案3

find自己可以的。

使用/etc-- 配置文件目录作为起点:

sudo find /etc -type f -perm 0400 -user root

在我的系统上,这不会返回任何内容。

您可以是一个限制较少并允许的组root(只有用户root应该是组的成员root),并注意以下权限440

sudo find /etc -perm 0440 -user root -group root

在我的系统上返回:

/etc/sudoers.d/README
/etc/sudoers

编辑:

根据您的编辑,您正在查找一个目录,该目录没有足够的权限让调用者阻止目录列出:

sudo find / -perm o-rwx -type d -user root -group root 

在这里,我正在寻找-type d缺少其他人 ( ) 的读写执行权限位o-rwx且由root:root.拥有的目录 ( )。

从技术上讲,只要缺少执行 ( ) 位就会阻止在目录上x列出目录 ( )。lstat(2)

/run/systemd/inaccessible/在我在基于 Systemd init 的系统上找到的输出中。

/proc关于、/sys、中的文件/dev

  • 这些文件系统是虚拟文件系统,即它们驻留在内存上,而不是磁盘上

  • 如果您打算依赖/proc,请使用/proc/1/ie 依赖 PID 1 下的某些内容,而不是任何后续的 PID 来获得可靠性/一致性,因为后续的 PID(进程)不能保证存在。

相关内容