我可以在私有目录下建立一个公共目录吗?


20

我在服务器上有一个个人文件夹/ a / b,权限为700。我不希望其他人列出/ a / b中的内容。/ a的所有者是root。

现在,我需要向所有用户打开目录/ a / b / c的完整权限。

我将/ a / b / c的权限更改为777,但其他人仍然无法访问。


2
您需要设置“执行位”以允许遍历目录(遍历/ a和/ a / b),这可能会解决您的问题:chmod +x /a/b
ex0ns 2015年

Answers:


34

您可以。您只需要在/a/b目录上设置可执行位。这样可以防止看到任何东西b,但是如果您直接去的话,您仍然可以做任何事情a/b/c

% mkdir -p a/b/c
% chmod 711 a/b
% sudo chown root a/b
% ll a/b
  ls: cannot open directory a/b: Permission denied
% touch a/b/c/this.txt
% ls a/b/c
  this.txt

请注意,尽管其他人无法列出的内容/a/b,但如果他们猜到了文件名,他们就可以访问该目录中的文件。

% echo hello | sudo tee a/b/f
% cat a/b/f
hello
% cat a/b/doesntexist
cat: a/b/doesntexist: No such file or directory

因此,请确保对目录中所有其他文件/目录保持适当的权限(没有组/世界)b,因为这样可以避免此警告。


作为设置可执行位的替代方法,您是否还可以提供到位于其他位置的a / b / c的硬链接?
Moby Disk

2
@MobyDisk您不能硬链接到目录。
迈克尔·汉普顿

这是行不通的,因为无论如何,您仍然需要阅读b以链接到c
stevieb

3
请注意,对此有一些重要警告。如果其中的任何文件a/b具有非零组/其他权限,并且对手知道或可以猜测其名称,则该对手可以与这些文件进行交互。
凯文

确实是@Kevin,在b创建之前,应针对其下所有内容的权限进行设置以防止这种情况发生c,然后在填充其他项目时需要进行认真调查,b以确保仅所有者安全。
stevieb 2015年

9

拥有这些权限,您将无法实现目标。为了进入目录c,您必须允许所有其他用户遍历目录b,这是通过授予该目录执行权限来完成的。通过/a/b设置为711模式,您可以实现所需的功能,因为您可以授予目录遍历功能,但拒绝进行读写操作。但是请记住,尽管其他用户无法在中列出文件/a/b,但如果他们猜到该名称并且文件具有足够的打开权限,则他们可能是访问文件。


3

如果用户无法访问/a/b,则他们将无法访问下方的任何文件/a/b/c。上的权限/a/b/c无关紧要,因为目录遍历在处停止/a/b

如果您只是想防止目录/a/b被列出,但是/a/b如果用户猜中文件名就可以访问文件,那么您可以使/a/b可执行文件变为可读文件。在目录上,读取权限仅控制列出目录内容,而执行权限控制对目录条目的访问。

# chmod u=rwx,go=x /a/b
# chmod u=rwx,go=rx /a/b/c
# echo 'hello' >/a/b/existingfile
# su bob -c 'ls -l /a/b'
ls: /a/b: Permission denied
# su bob -c 'cat /a/b/nosuchfile'
cat: /a/b/nosuchfile: No such file or directory
# su bob -c 'cat /a/b/existingfile'
hello
# su bob -c 'ls -l /a/b/c'
 contents of /a/b/

如果您不希望其他用户访问/a/b以外的文件/a/b/c,则可以/a/b/c通过bind mount通过另一个视图公开。

# chmod u=rwx,go=x /a/b
# chmod u=rwx,go=rx /a/b/c
# mkdir /c
# mount --bind /a/b/c /c
# su bob -c 'ls /a/b/c'
ls: /a/b/c: Permission denied
# su bob -c 'ls -l /c'
 contents of /a/b/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.