我正在寻找一种方法,使目录仅可由其父目录访问。也就是说,假设您有两个目录,A
和B
,它们在文件层次结构的同一级别。现在假设您有一个目录A'
,它是的子目录A
。我想强制A
能够访问 的内容,A'
但B
不能。
我的问题是我想使用一个A
基于另一个库 (目录 ) 的旧版本构建的库 (目录A'
)。同时,我希望能够使用这个旧库 (目录B
) 的最新版本。我想确保人们不会以某种方式使用库A
并链接新库,B
方法是强制该库A
必须使用库A'
。
我可以直接链接A
到库B
,但这样会存在兼容性风险。
答案1
使用群组权限,
假设你有一个组“foo”和另一个组“bar”,那么
/ | +-A | | | +- A' | +-B
chgrp -R bar B
设置子目录B的组权限。chgrp -R foo A
设置子目录A的组权限。
并让某些用户成为组“foo”的成员,这样他们就可以访问 A 及其下的子目录。现在,属于组“bar”的用户也将无权访问 A 及其相关子目录。
答案2
你的要求毫无意义。
只有正在运行的程序才能访问目录;目录不能“访问”另一个目录。
当您启动一个程序时,您的用户帐户将成为该正在运行的进程的所有者(如果您运行ps -fa
,您会在所有程序上看到您的 UID)1。
当该进程尝试读取文件时,系统会将进程所有者与文件的权限进行比较;如果用户被授予读取权限,则读取成功;否则,读取失败。
在程序 A 尝试链接到库的情况下,文件系统权限将/path/to/LibraryX
与程序 A 的进程所有者进行比较。即使文件/path/to/ProgramA
已设置权限,但在已经运行程序 A 的实例尝试读取/path/to/LibraryX
。仅针对进程所有者检查权限。
[1] - 例外情况是打开了 setuid 位的程序。当您启动这些程序(例如passwd
),则进程所有者将成为文件的所有者,而不是您自己。这就是为什么您passwd
可以编辑/etc/shadow
,而您的用户帐户却不能:它始终以 root 身份运行。