我需要这个进行单元测试。有一个函数在作为参数传递的文件路径上执行lstat 。我必须触发lstat
失败的代码路径(因为代码覆盖率必须达到90%)
该测试只能在单个用户下运行,因此我想知道 Ubuntu 中是否存在始终存在的文件,但普通用户对其或其文件夹没有读取权限。(所以lstat
除非以root身份执行,否则会失败。)
不存在的文件不是解决方案,因为有一个单独的代码路径,我已经触发了它。
编辑:仅缺乏对文件的读取权限是不够的。这样lstat
仍然可以执行。通过在 /root 中创建一个文件夹并在其中创建一个文件,我能够触发它(在我具有 root 访问权限的本地计算机上)。并在文件夹上设置权限 700。所以我正在寻找一个文件夹中的文件,该文件夹只能由 root 访问。
在现代 Linux 系统上,您应该能够使用
/proc/1/fdinfo/0
(id 1 的进程的文件描述符 1(stdout)的信息(init
在应该运行的根 pid 命名空间中root
))。您可以找到一个列表(作为普通用户):
-type f
(如果您不想限制为常规文件,请删除)。/var/cache/ldconfig/aux-cache
如果您只需要考虑 Ubuntu 系统,它是另一个潜在的候选者。它应该可以在大多数 GNU 系统上工作,因为/var/cache/ldconfig
它只能通过ldconfig
GNU libc 附带的命令对 root 进行读+写+搜索。查看lstat(2)手册页,您可以获得一些灵感,这些案例可能会导致它因 ENOENT 以外的错误而失败(文件不存在。)
最明显的一个是:
因此,您需要一个无法搜索的目录。
是的,您可以查找系统中已经存在的一个(也许
/var/lib/private
如果它存在?)但您也可以自己创建一个,相当于:lstat(2) 操作将在此处失败并出现 EACCES。(从目录中删除所有权限可确保这一点。也许您甚至不需要那么多,
chmod -x
删除执行权限就足够了,因为需要对目录的执行权限才能访问其下的文件。)还有另一种使 lstat(2) 失败的创造性方法,查看它的手册页:
因此,尝试访问诸如
/etc/passwd/nonexistent
应该触发此错误的文件,这又与 ENOENT(“没有此类文件或目录”)不同,并且可能适合您的需要。另一个是:
但是您可能需要一个非常长的名称(我相信 4,096 字节是典型的限制,但您的系统/文件系统可能有一个更长的名称。)
最后,很难说这些是否真的对你有用。你说你想要一些不会触发“文件不存在”场景的东西。虽然这通常意味着 ENOENT 错误,但实际上许多更高级别的检查只会将 lstat(2) 中的任何错误解释为“不存在”。例如
test -e
,或者来自 shell 的等价物[ -e ...]
可能只是将以上所有内容解释为“不存在”,特别是因为它没有返回不同错误消息的好方法,并且不返回错误将意味着文件存在,肯定不是这样。你可以
find
自己做。使用
/etc
-- 配置文件目录作为起点:在我的系统上,这不会返回任何内容。
您可以成为限制较少的允许组
root
(只有用户root
应该是组的成员root
),并注意以下权限440
:在我的系统上返回:
编辑:
根据您的编辑,您正在寻找一个没有足够权限让调用用户阻止目录列表的目录:
在这里,我正在寻找
-type d
缺少其他人 ( ) 的读写执行权限的目录 (o-rwx
) 并且归root:root
.从技术上讲,只是缺少执行 (
x
) 位会阻止目录lstat(2)
上的目录列表 ()。在我在
/run/systemd/inaccessible/
基于 Systemd init 的系统上找到的输出中。关于
/proc
,/sys
,中的文件/dev
:这些文件系统是虚拟 FS,即它们驻留在内存上,而不是磁盘上
如果您打算依赖
/proc
,请使用/proc/1/
ie 依赖 PID 1 下的某些东西,而不是任何以后的 PID 具有可靠性/一致性,因为不能保证以后的 PID(进程)存在。