我正在完成一项向标准 UNIX 系统添加时间支持的作业。然而,其中一部分涉及通过使备份文件不可见来保护备份文件的位置(默认情况下我们将其设置为系统根目录),即使通过“ls -al”之类的命令也可以,并且只能通过指定来访问它的绝对路径名。这是原始引用:
最后,历史目录应该是“虚拟的”,因为它们在检查代表根目录的 inode 的内容或执行“ls -al /”等命令时不会出现,并且只能通过直接 chdir 访问() (“cd”) 操作到历史路径名。
我一直在探索 UNIX 文件系统 API,但我还没有想出一种方法来强制执行此操作(我认为命令行程序或 bash 脚本中的这些程序的组合可能可以完成这项工作)。我的思考方向错了吗?
将不胜感激任何正确方向的指示或提示,谢谢:)
答案1
您可以删除目录的读取权限。在这种情况下,仍然可以访问其内容(文件或子目录,前提是它们的权限允许),但您必须知道(或:尝试...)它们的名称,因为不再可能列出目录内容。
答案2
x
您可以通过授予非 root 用户权限但不授予 权限来阻止非 root 用户列出目录的内容,同时允许他们访问该目录中的文件r
。对于目录,r
(“读取”)意味着您可以列出内容,而x
意味着您可以访问目录中或cd
目录中的文件。但是,这似乎不是分配的含义,因为它不是指权限。
对于普通文件系统,目录中的条目就是出现在目录列表中的条目。但是,如果您控制文件系统驱动程序,则可能会违反此约定。以下是您可能在野外发现的一些示例:
- 在不区分大小写的文件系统中,在列表仅显示一个文件的目录中
Foo
,您还可以访问名为 、 等的文件FOO
。fOO
它们都是同一个文件,因为文件系统驱动程序就是这样设计的。 - 某些自动挂载程序会对目录名称做出反应并尝试相应地挂载。例如,为 NFS 配置的自动挂载程序通常会决定,当您访问 时
/amnt/myserver/somedir
,它会尝试挂载myserver:/somedir
,从而使目录/amnt/myserver
和/amnt/myserver/somedir
进入存在状态。 - 在AVFS,如果文件被识别为存档,则您可以将其作为目录访问,但假目录名称不会出现在目录列表中:如果
ls ~/.avfs/path/to
显示 afoo.zip
则目录~/.avfs/path/to/foo.zip#
也存在。 - 某些文件系统快照系统按照您的作业所描述的方式运行:如果您访问目录
/snapshot/20140415022342
,或者/snapshot/yesterday
您在指定时间之前获取最新快照。