假设我有一个folder
在以下路径中调用的文件夹:
my_path = /a/b/c/d/e/folder
Run Code Online (Sandbox Code Playgroud)
以及file
在该文件夹中调用的文件。
然后,假设我运行此命令以删除 /a/ 下的组权限
> chmod g-rwx -R /a/
Run Code Online (Sandbox Code Playgroud)
现在,假设我授予以下+rx
权限folder
:
> chmod g+rx /a/b/c/d/e/folder
Run Code Online (Sandbox Code Playgroud)
然后,如果我组中的第二个用户运行:
> ls /a/b/c/d/e/folder
Run Code Online (Sandbox Code Playgroud)
或者
> cat /a/b/c/d/e/folder/file
Run Code Online (Sandbox Code Playgroud)
她得到许可错误,据我所知,这是因为我需要提供g+x
对folder
. 我的问题则,当或为什么会它曾经是有用的给+x
权限的目录中的父对象不是有吗?
谢谢
您需要对任何和所有父目录的 +x 权限才能 cd 或访问目录中的文件。
您需要目录中的 +r 权限才能列出文件。所以这是一个例子:
你可以发出这些命令来设置一些东西:
mkdir -p /a/b
touch /a/b/{file1,file2}
cd /a
echo 1 > b/file1
echo 2 > b/file2
没有权利:
pwd
/a$ pwd
/a
/a$ chmod -rwx b
/a$ ls -l
d--------- 4 mike admin 136 Jun 1 14:44 b/
/a$ ls -l b/
ls: : Permission denied
/a$ cat b/file1
cat: b/file1: Permission denied
Run Code Online (Sandbox Code Playgroud)
仅执行
/a$ chmod +x b
/a$ ls -l
total 0
d--x--x--x 4 mike admin 136 Jun 1 14:44 b/
/a$ ls -l b
ls: b: Permission denied
/a$ cat b/file1
a
/a$ ls -l b/file1
-rw-r--r-- 1 mike admin 2 Jun 1 14:43 b/file1
Run Code Online (Sandbox Code Playgroud)
现在阅读:
/a$ chmod +r b/
/a$ ls -l
/a$ ls -l
total 0
dr-xr-xr-x 4 mike admin 136 Jun 1 14:44 b/
/a$ ls -l b/
total 16
-rw-r--r-- 1 mike admin 2 Jun 1 14:43 file1
-rw-r--r-- 1 mike admin 2 Jun 1 14:43 file2
Run Code Online (Sandbox Code Playgroud)
这部分可能有点混乱,但只有读取而不执行,您实际上可以列出目录中的文件,但不能读取 inode 元数据,因此您将获得权限被拒绝但仍然能够看到文件列表在如下目录中..
/a$ chmod -x b/
/a$ ls -l
total 0
dr--r--r-- 4 mike admin 136 Jun 1 14:44 b/
/a$ ls -l b
ls: file1: Permission denied
ls: file2: Permission denied
Run Code Online (Sandbox Code Playgroud)
大多数情况下,如果您想阻止对整个目录(包括其子目录)的访问和使用,您可以通过删除它(非递归)来实现-x
。因此,您可能在子目录中留下了+x
,而不会造成任何伤害。
出于多种原因,保留对子目录的权限可能很有用(尤其是在-x
不适用于所有人但至少有一个用户仍然可以执行某些操作时)。
例如,您可以暂时阻止容器目录的使用,同时对该目录结构中的权限进行其他更改,然后在一次操作中重新启用对整个树的访问(提供+x
给顶级目录)。
您还可能遇到这样的情况:脚本(不一定由所有者运行)将目录树备份到临时位置(其他人不应读取)并将所有内容放在 tar 文件中,从而保留目录的内容。