Linux-权限系统

背景

本文对Linux下的权限管理进行简要的描述,阅读书籍是《Linux命令行与Shell脚本大全》

内容

以前学的时候,讲到/etc/passwd文件存放了用户的信息,但是牵扯到密码的隐私问题,所以文件中只用x取代了原密码位,而真实存放密码的文件是/etc/shadow,仔细查看内容如下:

1
2
# 列举了其中的一条
test:$1$wesgrt55$QT8CyMTQnzH66xIL1CqHj.:18599:0:99999:7:::

其中用:间隔了9个子段,含义分别如下:

1
2
3
4
5
6
7
8
9
第1位:用户名
第2位:加密后的密码
第3位:上次修改密码后过去的天数(与1970/1/1相比)
第4位:多少天后允许修改密码
第5位:多少天后必须修改密码
第6位:过期前多少天提醒用户修改密码
第7位:密码过期多少天后,账户被禁用
第8位:用户账户被禁用的日期(与1970/1/1相比)
第9位:预留位

这两个文件都是可以通过编辑器进行修改的,但是强烈不建议,因为一旦格式出了问题,那么所有的用户都将无法登录,因此建议通过指定的命令进行修改,比如添加用户,则可以使用useradd:

1
2
# useradd在不指定参数的情况下,会有默认的信息进行设置,查看默认设置用-D
useradd -D

执行后,会得到如下信息:

1
2
3
4
5
6
7
8
9
test@VM-16-5-ubuntu:~$ useradd -D

GROUP=100 --> # 新用户默认的用户组
HOME=/home --> # 新用户默认的Home目录
INACTIVE=-1 --> # 设置用户在密码过期后不会被禁用
EXPIRE= --> # 不设置过期时间
SHELL=/bin/sh --> # 默认的登录shell
SKEL=/etc/skel --> # 如果指定了Home目录,则Linux会将该目录下的文件全部复制到指定的用户Home目录下
CREATE_MAIL_SPOOL=no --> # 帮用户在MAIL目录下创建接受邮件的文件

当然,这些默认值都是可以修改的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -b:修改默认的Home目录
useradd -D -b /Home/test

# -g:修改默认的归属组
useradd -D -g 101

# -f:修改密码过期到被禁用之间的天数
useradd -D -f 10

# -s:更改默认的登录shell
useradd -D -s /bin/bash

# -e:指定账户的默认过期时间
useradd -D -e 2050/12/31

其次可以通过useradd添加新用户,如果需要修改其默认的一些参数,则追加对应的参数(列举部分):

1
2
3
4
5
6
7
8
9
10
# -k:指定复制到Home下的来源文件
# -g:指定所属于的用户组,不指定就创建一个与用户同名的用户组
# -G:附加组
# -m:创建用户的Home目录
# -e:指定过期时间,格式:YYYY-MM-DD
# -c:创建时添加备注信息
# -p:指定用户密码
# -s:指定用户的shell程序

useradd -g zhaoyue -G sudo -m -e 2050-12-31 -c "测试添加用户" -p kmn123 -s /bin/bash test

删除用户的话就很方便,使用userdel

1
2
# -r:删除用户的同时将其Home目录一并删除
userdel -r [用户名]

而如果需要修改用户的信息的时候,则可能麻烦一些,因为命令比较多,但首推usermod,因为它能修改绝大部份的用户信息,它的参数和useradd有很多重复之处,比如此前我们讲过的

1
2
3
4
5
6
7
8
# 修改用户主组
usermod -g [组名] [用户名]

# 修改用户附加组
usermod -G [附加组名] [用户名]

# 修改用户登录的默认shell
usermod -s [shell程序] [用户名]

此外还有修改用户个人信息的

1
2
3
4
5
6
7
8
# -e:修改账户的过期时间
usermod -e 2090-12-31 [用户名]

# -l:修改用户名的
usermod -l [新名称] [旧用户名]

# -p:修改密码的,这个可以不用管,不好用
usermod -p [加密后的密文] [用户名]

当然还有一些比较高级的地方,比如锁定用户,不允许其登录

1
2
3
4
5
# 锁定用户,锁定期间从root还是可以登录用户的账户的
usermod -L [用户名]

# 解锁用户
usermod -U [用户名]

上面说到usermod -p不好用,是因为其密码必须是加密后的,Linux还提供了其他的方式:passwd、chpasswd

1
2
3
4
5
6
7
8
9
10
11
# 修改单个用户的密码
passwd [用户名]

# -e:让用户在下次登录的时候强制改密码
passwd -e [用户名]

# 批量修改用户的密码,譬如此处通过文本编辑好以后重定向
chpasswd < passwd.txt

# 关于passwd中文件的格式:[用户名]:[密码],如下:
test:passwd

其次,Linux还提供了修改用户默认登录shell的单独命令:chsh

1
chsh -s /bin/bash [用户名]

以及修改用户个人信息的命令:chfn

1
2
3
4
chfn [用户名]

# 修改完以后,你可以查看/etc/passwd文件的内容如下:
test:x:1001:1001:test,hefei,123456,123456,shuai:/home/wuxiaoshuai:/bin/bash

还有修改用户过期时间的命令:chage

1
2
3
4
5
6
7
# -d:设置修改密码到现在的天数
# -E:设置密码过期的时间,支持YYYY-MM-DD和天数的格式(天数是与1970-1-1的差值)
# -I:设置密码过期到锁定账户之间的天数
# -m:设置修改密码之间要间隔的天数
# -W:设置密码过期前多少天出现提示

chage -E 2020-12-21 [用户名]

在Linux中,系统通过组管理属于该组中的用户,而创建组的命令是groupadd

1
2
3
4
groupadd [组名]

# 添加完以后可以查看/etc/group文件信息,如下
test:x:1001:shuai,baqi

此处有一点需要说明,当用户在/etc/passwd中指明属于的默认组以后,则该用户名不会出现在/etc/group中。而当我们需要对组信息进行修改的时候,则可以通过groupmod命令

1
2
3
4
5
# -g:修改组对应的组编号
groupmod -g [期望的组编号] [组名]

# -n:修改组名称
groupmod -n [新组名] [旧组名]

如果需要删除组,则可以借助命令:groupdel

1
groupdel [组名]

讲完上面的权限设置后,就会讲到Linux系统中的文件权限,在Linux中,一切皆文件,这其中包括它的容器:文件夹。当我们创建文件或者文件夹的时候,系统会给当前账户创建的文件赋予默认的权限,这个默认权限可以使用umask查看

1
2
3
4
umask

# 你会得到类似如下内容,不容易看懂
0002

关于0002,它其实是默认权限的补码,并且除了第一位外,其他的都是8进制位,也就是它记录的是系统不想赋予创建文件的权限,具体如下:

1
2
3
4
第1位:粘着位,你可以理解为标志位,起标示作用
第2位:主用户的权限补码
第3位:主用户所属于的组的权限补码
第4位:其他用户的权限补码

而需要理解的话,则还需要说出一个事实:在Linux中系统默认能给文件的全权限是rw-,给文件夹的全权限是rwx。至于为什么文件不能给rwx,这是因为Linux系统设定的,文件默认不允许执行,除非用户自己设定。而rw-对应的8进制是666rwx对应的8进制位是777。在这个基础上,就好理解了:

1
2
3
4
5
6
7
# 对于文件而言
计算:0002 --> 002 --> 666-002 --> 664 --> rw-rw-r--
结论:创建的文件对主用户、用户所属组具有可读可写权限,对其他用户具有可读权限

# 对于文件夹而言
计算:0002 --> 002 --> 777-002 --> 775 --> rwxrwxr-x
结论:创建的文件对主用户、用户所属组具有可读可写可执行权限,对其他用户具有可读、可执行权限

当然,用户也可以通过umask命令直接修改默认的权限值

1
2
# 记住一点,umask后面跟的都是你不想给的权限对应的8进制值
umask 026

也许你会想到,假如我给umask一个奇数值,则在创建文件的时候不就会给文件默认加上可执行权限了吗?我在ubuntu上试了,它貌似向下取偶数:

1
2
3
4
5
test@VM-16-5-ubuntu:~/test$ umask
0036 --> # 理论上我创建的文件应该是rw--wx--

test@VM-16-5-ubuntu:~/test$ ls -lha
-rw-r----- 1 ubuntu ubuntu 0 Dec 5 17:00 ji12

那么,如果我们需要修改已经存在的文件/文件夹的权限呢?可以使用chmod:

1
2
3
4
5
# -R:表示将文件夹中的每个文件都执行该权限
chmod -R 776 [文件/文件名]

# 或者给所有用户都加上可执行权限
chmod +x [文件/文件名]

通过8进制代码修改,是对所有的用户都操作了,chmod也支持在原有权限基础上追加修改权限

1
2
3
4
5
6
7
8
9
10
# 格式:chmod [ugoa][+-=][rwx] [文件/文件名]

# 给主用户添加可执行权限
chmod u+x file

# 给其他用户去掉可读权限
chmod o-r file

# 给所有用户只有可读权限
chmod a=r file

如果我们需要修改文件/目录所属的用户/组,则可以通过chown

1
2
3
4
5
# 用户和组可以看情况省略其中一个
chown [用户].[组] [文件/目录]

# -R: 递归修改
chown -R [用户].[组] [文件/目录]

对于修改文件/目录所属的组,Linux也提供了单独的命令chgrp

1
chgrp [用户组] [文件/目录]

未结补充

本文中未对文件系统做简要描述了,主要目前手头没有合适的虚拟机进行尝试,云服务器中的磁盘也没看懂