使用 Linux 系统,不免会和用户和权限打交道,本文介绍了根权限和文件的权限属性等概念和应用。

用户与群组

使用cat /etc/passwd查看所有用户

使用cat /etc/group查看所有用户组

修改文档所有者或群组

1
2
3
4
5
6
# command [-options] [账号/群组] [文件或目录]
# 改变文档所属用户或用户组,-R为可选参数,表示递归表更
chown [-R] [账号] [文件或目录]
chown [-R] [账号]:[群组] [文件或目录]
# 改变文档所属用户组
chgrp [-R] [群组] [文件或目录]

Linux权限

命令

1
2
3
chmod | u g o a | + - = | r w x | 文档路径
#
chmod | xxx | 文档路径

  • u,g,o代表三种身份owner/group/other,a代表全部身份all
  • +-=代表三种操作行为(添加/删除/设置权限)
  • rwx表示三种权限,也可以使用4/2/1或者他们的和作为权限,如5代表rx
  • xxx代表三位数字,rwx分别为4/2/1,三种权限相加可以得出一种身份的权限

示例:

1
2
3
4
5
6
7
8
9
10
#test文件设置所有人拥有所有权限
chmod u=rwx,g=rwx,0=rwx test
chmod ugo=rwx test
chmod a=rwx test
chmod ugo+rwx test
chmod 777 test
# 所有人添加执行权限
chmod a+x test
# 所有人删除写权限
chmod a-w test

对于文件来说x表示文件可以被系统执行的权限,对于目录来说,x代表着可以进入目录的权限,即可以cd进入

文档属性

使用命令ls -al --full-time 或者ll可以查看文件或者目录的所有属性

共有7列,分别是:

  • 第一列(共10位) 第1位表示文档类型,d表示目录,-表示普通文件,l表示符号链接,s表示套接字,b表示块设备(光驱、磁盘),c表示字符设备(鼠标、键盘),p表示管道。其中s/b/c/p都是伪文件。第2-10位,共9位,分表对应owner/group/others的权限,rwx分表表示readable/writable/excutable,-表示没有当前权限。
  • 第二列 关联硬链接数,对于一个新建文件夹来说,有两个链接,对于一个新建文件来说,有一个链接。
  • 第三列 表示文档所属owner
  • 第四列 表示文档所属group
  • 第五列 表示文档大小,单位字节,可以通过ls -h选项以最合适的单位显示
  • 第六列 表示文档最后修改时间
  • 第七列 表示文档名,隐藏文件以.开头

su 和 sudo

在 Linux 中,su命令和sudo命令有着十分巨大的区别:

  • su命令会把你切换到根用户root
  • sudo会使用根权限来执行命令

我们可以通过修改(需要 root 权限)下列文件的中的用户列表,来决定哪些用户可以执行 sudo 命令:

1
sudo /usr/sbin/visudo

默认情况下,这个列表如下所示:

1
2
#User privilege specification
root ALL=(ALL) ALL

每一个 sudo 行的语法是:

1
user machine=(effective_user) command

通过上面的语法,我们可以授予某个用户 root 权限,其中每一个域代表:

  • user是新的sudo用户的用户名
  • machinesudo生效的主机名
  • effective_user代表被允许执行命令的有效用户
  • command代表这这个用户可以执行的一系列命令

详解 umask

每一个文件和文件夹在被创建的时候都会被赋予一定的权限属性,这些值可以通过 umask 来指定。正如 umask 的名称所显示的那样,这个值本身其实就是一个可以禁用相应权限属性的掩码。

掩码由一个有效的48进制数值。如果把少于4位的数值作为参数传入,高位会被用 0 补全。

默认情况下,文件夹在被创建的时候能获取的权限属性是777(rwxrwxrwx),文件在被创建的时候能获取的权限属性是666(rw-rw-rw-),二者的值都可以被被 umask 的掩码给减掉。

我们可以这样来查看当前的umask值:

1
2
3
4
5
6
7
$ umask
022
$ touch text_file
$ mkdir text_dir
$ ls -l
drwxr-xr-x  2 zhangrui  staff  64 Jan 22 23:15 text_dir
-rw-r--r--  1 zhangrui  staff   0 Jan 22 23:15 text_file

我们可以通过如下方式修改umask值:

1
2
3
4
5
6
7
8
# 当前会话中的umask设定为077
$ umask 077
# 所有者添加所有权限,删除组或其他用户的所有权限
$ umask u+rwx,g-rwx,o-rwx
# 设置所有者具有所有权限,设置组或其他用户不具有任何权限
$ umask u=rwx,g=,o=
drwx------  2 zhangrui  staff  64 Jan 22 23:26 **test_dir**
-rw-------  1 zhangrui  staff   0 Jan 22 23:25 test_file

注意默认情况下文件创建不具备x权限,通过umask并不能给文件创建添加x权限,umask只能用来减权限,不能用于添加权限。

如果想要系统上的所有用户或者指定用户都使用设定的umask值的话,我们需要把相应的设定写入/etc/profile或者指定的~/.bashrc文件中去。