开篇词
为方便用户与组对文件与目录的权限进行管控,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
遍历地方式更改目录及其子目录与文件的所属组
借助由 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
更改一个或多个文件或目录的所属组
我们可以通过 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
更改一个或多个文件或目录的模式位
我们可以通过 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+rwx
或 ugo=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
我们通过 gcc
来编译 test.c
文件,运行并检查其权限:
gcc test.c # 默认情况下,通过 gcc 编译器所编译的可执行文件叫 a.out
./a.out # 执行编译的二进制文件
ll a.out
新建文件的权限为 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 管理员手册:既简单又深刻》