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
| # 锁定用户 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
以及修改用户个人信息的命令: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 [新组名] [旧组名]
|
讲完上面的权限设置后,就会讲到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进制是666
,rwx
对应的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-r----
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
:
未结补充
本文中未对文件系统
做简要描述了,主要目前手头没有合适的虚拟机进行尝试,云服务器中的磁盘也没看懂