chmod

时间:2020-01-09 10:37:40  来源:igfitidea点击:

无法分配目录和文件的权限?获取权限被拒绝错误?或者我们有很多目录和文件,并试图弄清楚如何递归使用chmod来更改权限?是否要对所有文件或者目录应用777或者755权限?

在本教程指南中,我们将了解chmod的用法以及如何使用单个命令更改文件和目录的权限。

什么是chmod?

  • chmod是GNU实用程序,在Linux发行版中作为coreutils rpm的一部分提供。

  • chmod是变更模式的缩写。

  • 它用于根据模式更改每个给定文件/目录的文件模式位。

  • 我们可以使用更改的符号表示形式,也可以使用八进制数字表示新模式位的位模式。

  • 符号模式的格式为[[ugoa ...] [[-+ =] [perms ...] ...],其中perms为零或者来自集合rwxXst的多个字母

  • 我们还可以使用chmod添加/修改/删除特殊权限,例如setuidsetgidsticky 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=7rwx
读+写4+2+0=6rw-
读取+执行4+0+1=5r-x
读取4+0+0=4r--
写入+执行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的组合。

使用findchmod更改权限的语法为

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