chmod
无法分配目录和文件的权限?获取权限被拒绝错误?或者我们有很多目录和文件,并试图弄清楚如何递归使用chmod来更改权限?是否要对所有文件或者目录应用777或者755权限?
在本教程指南中,我们将了解chmod
的用法以及如何使用单个命令更改文件和目录的权限。
什么是chmod?
chmod是GNU实用程序,在Linux发行版中作为coreutils rpm的一部分提供。
chmod是变更模式的缩写。
它用于根据模式更改每个给定文件/目录的文件模式位。
我们可以使用更改的符号表示形式,也可以使用八进制数字表示新模式位的位模式。
符号模式的格式为
[[ugoa ...] [[-+ =] [perms ...] ...]
,其中perms为零或者来自集合rwxXst的多个字母我们还可以使用
chmod
添加/修改/删除特殊权限,例如setuid
,setgid
,sticky bit
。
什么是--preserve-root?为什么要使用它?
在本教程中,我将对我的所有
chmod
命令使用--preserve-root
。当我们计划递归分配权限时,建议使用此选项,因为这可能具有破坏性
误以为我们从
/(root)
目录中删除了所有权限,这将导致系统无法使用它类似于运行
rm -rf /
,如果我们是Linux管理员,则应该知道,这可能会破坏服务器。使用--preserve-root,我们通知命令"不要修改根目录权限"。
请勿使用此命令
# chmod --changes --recursive 755 /
这将递归地更改/
下所有文件和dir的权限,这也可能破坏系统
在这种情况下,始终建议使用
# chmod --changes --recursive --preserve-root 755 / chmod: it is dangerous to operate recursively on '/' chmod: use --no-preserve-root to override this failsafe
可能无法每次都在chmod
中使用此添加选项,因此我们可以创建
alias`
# alias chmod='chmod --preserve-root'
并将其添加到/etc/bashrc
或者单个用户的.bashrc
文件中以进行永久更改
现在,如果我们使用chmod
,则不允许修改root权限
# chmod -c --recursive 755 / chmod: it is dangerous to operate recursively on '/' chmod: use --no-preserve-root to override this failsafe
Linux权限语法
我们可以使用此表来了解与chmod
一起使用的不同符号或者八进制值
权限 | 八进制 | 语法(符号) |
---|---|---|
读+写+执行 | 4+2+1=7 | rwx |
读+写 | 4+2+0=6 | rw- |
读取+执行 | 4+0+1=5 | r-x |
读取 | 4+0+0=4 | r-- |
写入+执行 | 0+2+1=3 | -wx |
写 | 0+2+0=2 | -w- |
执行 | 0+0+1=1 | --x |
使用-R或者--recursive执行chmod递归
如果所有文件和目录都在一个父目录下,则可以直接使用chmod -R <dir_name>
递归分配权限
syntax
递归地修改文件和目录的权限:
chmod [--changes|-c] {--recursive|-R} {PATH}
希望我们知道,在"语法"中,方括号" []"下的所有内容都是"可选",花括号" {}"下的所有内容都是"必选"
在此语法中,我还添加了--changes或者-c作为可选内容,因为这将通知我们更改是否确实在后端发生了
分配755在/opt/dir下的所有文件和目录的权限
# chmod -c -R 755 /opt/dir
如果已经分配给/opt/dir下的任何文件或者目录,那么"这还将删除所有特殊权限"。例如,我在/opt/dir
下创建了具有"特殊粘滞位"权限的文件。一旦我递归地应用了" chmod",特殊的粘性位权限也被删除了。
mode of '/opt/dir/' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---) mode of '/opt/dir/file' changed from 7555 (r-sr-sr-t) to 0750 (rwxr-x---)
重要的提示:
如果要更改/opt/dir
下文件和目录的权限,而不是/opt/dir
本身的权限,则应使用chmod -c -R <permission>/opt/dir/*
。这将更改/opt/dir /目录下的所有内容的权限,但不会更改目录目录本身的权限。
我们也可以在此处使用八进制方法,在此示例中,我已向用户添加了完全权限,为组读取并执行了该权限,并删除了其他用户的所有权限,这相当于八进制方法中的750
# chmod -c -R u+rwx,g+rx,o-rwx /tmp/dir1/* mode of '/tmp/dir1/dir2/file5' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---) mode of '/tmp/dir1/dir2/dir3' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---) mode of '/tmp/dir1/dir2/dir3/file1' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---) mode of '/tmp/dir1/dir2/dir3/file2' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---) mode of '/tmp/dir1/dir2/dir3/file5' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---) mode of '/tmp/dir1/dir2/dir3/file3' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---) mode of '/tmp/dir1/dir2/dir3/file4' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---)
验证权限
# tree -p /tmp/dir1/ /tmp/dir1/ ├── [drwxr-x---] dir2 │ ├── [drwxr-x---] dir3 │ │ ├── [-rwxr-x---] file1 │ │ ├── [-rwxr-x---] file2 │ │ ├── [-rwxr-x---] file3 │ │ ├── [-rwxr-x---] file4 │ │ └── [-rwxr-x---] file5 │ └── [-rwxr-x---] file5 └── [-rwxr-x---] file10 2 directories, 7 files
由于我在命令中使用了/tmp/dir1/*,因此dir1
的权限不会被修改。
# ls -ld /tmp/dir1/ drwxr-xr-x 3 root root 4096 Jan 23 12:02 /tmp/dir1/
警告:
确保递归执行" chmod"之前,我们已经正确检查了该命令,因为它是不可逆的
现在上述命令的一些"缺点"
它将修改单个路径下所有文件和目录的权限。如果我们在不同位置(例如/opt,/var/tmp)有很多文件或者目录,则最终将多次执行chmod
无法区分文件和目录。如果我们只需要更改文件或者目录的权限,则该工具本身无法处理此问题。
同样,如果我们想使用特定的命名语法更改某些文件或者目录的权限,则该工具无法自行处理此类过滤器
因此,在应用" chmod"命令之前,我们需要使用" find"命令来处理这些过滤器。
find可以应用这些过滤器,然后可以与exec或者xargs结合使用以执行chmod命令。如果结合使用" find"和" chmod",则不需要" --recursive"或者" -R",因为" find"本身将搜索所有文件并为" chmod"传递单个文件作为输入参数。让我给我们一些例子,以更好地理解:
与exec一起使用find来更改权限
我已经写了一个描述性的教程来学习和理解find和exec的组合。
使用find
和chmod
更改权限的语法为
find {PATH} [OPTIONS] -exec [COMMAND] {} \;
将
PATH
替换为文件或者目录的位置我们可以使用find命令选择所有受支持的选项,例如define
-type
或者-name
等。将
COMMAND
替换为chmod <permission>
请勿删除或者替换
{} \;
,因为find会使用它来递归查找文件或者目录,并将找到的文件作为COMMAND的输入参数提供。因此,如果find命令找到名为" myfile"的文件,则" COMMAND"将成为chmod <permission> myfile
搜索"/tmp"下的所有文件,并将其权限更改为644
# find /tmp -type f -exec chmod --changes 644 {} \;
要使用符号方法分配相同的权限,请执行以下操作:
# find /tmp -type f -exec chmod --changes u=rw,go=r {} \;
搜索"/tmp"下的所有目录,并将其权限更改为755
# find /tmp -type d -exec chmod --changes 755 {} \;
要使用符号方法分配相同的权限,请执行以下操作:
# find /tmp -type d -exec chmod --changes u=rwx,go=rx {} \;
将find与xargs一起使用以更改权限
同样,我们也可以将find与xargs
结合使用以递归分配权限
将find与xargs和chmod一起使用的语法是:
find {PATH} [OPTIONS] -print0 | xargs -0 [COMMAND]
其中-print0
告诉find将所有结果打印到std,每个结果都用ASCII NUL字符'\ 000'分隔。-0'
告诉xargs输入将用ASCII NUL字符'\ 000分隔'
搜索"/tmp"下的所有文件,并将其权限更改为644
# find /tmp -type f -print0 | xargs -0 chmod --changes 644
要使用符号方法分配相同的权限,请执行以下操作:
# find /tmp -type f -print0 | xargs -0 chmod --changes u=rw,go=r
搜索"/tmp"下的所有目录,并将其权限更改为755
find /tmp -type d -print0 | xargs -0 chmod --changes 755
要使用符号方法分配相同的权限,请执行以下操作:
# find /tmp -type d -print0 | xargs -0 chmod --changes u=rw,go=rx