44. 文件权限- chown、chgrp、chmod、umask

开篇词

为方便用户与组对文件与目录的权限进行管控,Linux 提供了一些常见的命令可以将权限以一种更标准的方式分配给用户和组或从他们那召回。
 

更改一个或多个文件或目录的所有者和所属组

使用 chown 命令,我们可以给文件或目录分配所有者或所属组。

更改文件或目录的所有者、所属组或两者

如果我们只想指定所有者:

chown user file_for_user    # 该命令只会将 file_for_user 文件的所有者指定为 user

如果我们只想指定所属组:

chown :user file_for_user    # 该命令只会将 file_for_user 文件的所属组指定为 user

我们来以 root 用户的权限常见文件,并使用 chown 命令来将文件的所有者和所属组改成 user

touch file_for_user
ll file_for_user
chown user:user file_for_user    # 冒号左边是文件的所有者,而其右边则是文件的所属组
ll file_for_user

创建一个文件并将其所有者以及所属组更改为 user

遍历地方式更改目录及其子目录与文件的所属组

借助由 chown 命令所提供的 -R 参数,我们能以迭代的方式为目录、子目录以及目录内的所有文件分配相同的所属组:

mkdir -p a/b/c/d/e
tree a
ll a && ll a/b && ll a/b/c && ll a/b/c/d
chown -R :user a    # 等价于 chgrp -R user a
ll a && ll a/b && ll a/b/c && ll a/b/c/d

创建多级目录并遍历更改目录、子目录以及所有文件的所属组为 user
 

更改一个或多个文件或目录的所属组

我们可以通过 chgrp 命令来只为文件指定所属组:

mkdir -p 1/2/3/4/5
tree 1
ll 1 && ll 1/2 && ll 1/2/3 && ll 1/2/3/4
chgrp -R user 1    # 等价于 chown -R :user 1
ll 1 && ll 1/2 && ll 1/2/3 && ll 1/2/3/4

创建多级目录并遍历更改目录、子目录以及所有文件的所属组为 user

更改一个或多个文件或目录的模式位

我们可以通过 chmod 命令来将文件或目录的读、写、或执行权限追加、分配至用户、组、其他,或所有人,或从他们那召回。
我们来创建一个用以演示的文件:

touch file_permissions
ll file_permissions

创建一个文件并将其列出

使用字母模式位来更改权限

字母模式位:43. 文件权限

使用 rwx 来更改用户权限

ll file_permission
chmod u+rwx file_permission    # 该命令将读、写以及执行权限追加至文件的所有者
ll file_permission
chmod u-w file_permission    # 该命令删除文件所有者的写权限
ll file_permission
chmod u=rw file_permission    # 该命令将读和写权限分配给文件所有者
ll file_permission

使用 rwx 来更改组权限

ll file_permission
chmod g+rwx file_permission    # 该命令将读、写和执行权限追加至文件所属组
ll file_permission
chmod g-w file_permission    # 该命令删除文件所属组的写权限
ll file_permission
chmod g=r file_permission    # 该命令将读权限分配给文件所属组
ll file_permission

使用 rwx 来更改其他权限

ll file_permission
chmod o+rwx file_permission    # 该命令将读、写和执行权限追加至其他用户
ll file_permission
chmod o-w file_permission    # 该命令删除其他用户的写权限
ll file_permission
chmod o=r file_permission    # 该命令将读权限分配给其他用户
ll file_permission

使用 rwx 来更改所有权限

ll file_permission
chmod a+rwx file_permission    # 该命令将读、写和执行权限追加至全部
ll file_permission
chmod a-w file_permission    # 该命令删除所有的写权限
ll file_permission
chmod u=rw,go=r file_permission    # 该命令将写和读权限分配给所有者,并只将读权限分配给所属组和其他用户
ll file_permission

使用数字模式位来更改权限

数字模式位:43. 文件权限

使用 7654321 来更改所有用户权限

ll file_permission
chmod 777 file_permission    # 该命令将读、写和执行权限分配给文件所有者、所属组以及其他用户
ll file_permission
chmod 666 file_permission    # 该命令将读和写权限分配给文件的所有者、所属组以及其他用户
ll file_permission
chmod 555 file_permission    # 该命令将读和执行权限分配给文件的所有者、所属组以及其他用户
ll file_permission
chmod 444 file_permission    # 该命令将读权限分配给文件的所有者、所属组以及其他用户
ll file_permission
chmod 333 file_permission    # 该命令将写和执行权限分配给文件的所有者、所属组以及其他用户
ll file_permission
chmod 222 file_permission    # 该命令将写权限分配给文件所有者、所属组以及其他用户
ll file_permission
chmod 111 file_permission    # 该命令将执行命令分配给文件所有者、所属组以及其他用户
ll file_permission
chmod 644 file_permission    # 该命令将读和写权限分配给文件所有者,并将读权限分配给组以及其他用户
ll file_permission


 

umask

借助 umask 的特性,我们可以为新文件预设权限。新文件的权限是对 umask 的基于 0777 最大权限值进行裁剪来获得的。

以数字值方式检查 umask

umask 的默认输出为数字模式位:

umask

以字母值方式检查 umask

通过加入 -S 参数,我们可以查看其字母模式位:

umask -S

通过数字模式位来更改值

不给任何人任何权限 - 0777

umask 0777    # 等价于 777 或 ugo-rwx
umask
umask -S
touch new_file_without_any_permission_num
ll new_file_without_any_permission_num


新建文件的权限为 0000(0+0+0 0+0+0 0+0+0 0+0+0),也就是 0777 减去 0777 的结果。

给任何人所有权限 - 0000

umask 0000    # 等价于 000 或 ugo+rwx 或 ugo=rwx
umask
umask -S
touch new_file_with_every_permissions_num
ll new_file_with_every_permissions_num


新建文件的权限为 0666(0+0+0 4+2+0 4+2+0 4+2+0),也就是 0777 减去 0111(所有者、所属组以及其他用户的执行权限) 的结果。
由于这是一个不可执行文件,所以其将不会被授予执行权限。

通过字母模式位来更改值

不给任何人任何权限 - ugo-rwx

umask ugo-rwx    # 等价于 777 或 0777
umask
umask -S
touch new_file_without_any_permission_sym
ll new_file_without_any_permission_sym


新建文件的权限为 ---------(‑+‑+‑ ‑+‑+‑ ‑+‑+‑ ‑+‑+‑),也就是 rwxrwxrwx 减去 rwxrwxrwx 的结果。

给任何人所有权限 - ugo+rwxugo=rwx

umask ugo+rwx    # 等价于 000 或 0000 或 ugo=rwx
umask
umask -S
touch new_file_with_every_permissions_sym
ll new_file_with_every_permissions_sym


新建文件的权限为 rw-rw-rw(‑+‑+‑ r+w+‑ r+w+‑ r+w+‑),也就是 rwxrwxrwx 减去 --x--x--x(所有者、所属组以及其他用户的执行权限) 的结果。
和先前的例子一样,由于这是一个不可执行文件,所以其将不会被授予执行权限。

umask 值恢复至初始值

umask 0022
umask
umask -S

对不可执行文件的影响

我们可以通过几种方式来创建不可执行文件,三种最简单的方式为:

touch touch_non_executable_file
echo '' > echo_non_executable_file
printf '' > printf_non_executable_file


新建文件的权限为 0644(0+0+0 4+2+0 4+0+0 4+0+0),也就是 0777 减去 0022(所属组以及其他用户的写权限) 和 0111(所有者、所属组以及其他用户的执行权限) 的结果。

对可执行文件的影响

为了创建一个可执行文件以用作演示,我们需要安装一个叫 gcc 的编译器以编译 C 语言代码:

yum install gcc -y

我们创建一个叫 test.c 的文件:

printf '%s\n' \
'#include <stdio.h>' \
'int main()' \
'{' \
'    printf("Test! \n");' \
'    return 0;' \
'}' > test.c
cat test.c

将 C 代码打印至 test.c 文件
我们通过 gcc 来编译 test.c 文件,运行并检查其权限:

gcc test.c    # 默认情况下,通过 gcc 编译器所编译的可执行文件叫 a.out
./a.out    # 执行编译的二进制文件
ll a.out

编译 C 代码,运行二进制文件并列出程序及其权限
新建文件的权限为 0755(0+0+0 4+2+1 4+0+1 4+0+1),也就是 0777 减去 0022(所属组以及其他用户的写权限)的结果。

当在不可执行文件上设置字母模式位时没有指定用户

当指定模式位时如果没有指定用户,新建的不可执行文件也将从 umask 获取写权限:

touch new_touch_file
ll new_touch_file
chmod +rwx new_touch_file
ll new_touch_file

创建新文件,指定模式位当不指定任何用户并列出文件及其权限
新建文件的权限为 0755(0+0+0 4+2+1 4+0+1 4+0+1),也就是 0777 减去 0022(所属组以及其他用户的写权限)的结果。
 

我所撰写的英文版本

44. File Permissions - chown, chgrp, chmod, umask
 

引用

参见

上一篇:

想看手册的其他内容?请访问该手册的所属专栏:《Linux 管理员手册:既简单又深刻

发布了142 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104272990