Linux用户和用户组
参考:https://blog.csdn.net/love20165104027/article/details/82386271
跟用户相关的文件:
/etc/passwd
/etc/shadow
跟组相关的文件:
/etc/group
/etc/gshadow
/etc/passwd的文件内容:
root:x:0:0:root:/root:/bin/bash
第一个字段:账号名称
第二个字段:密码。(密码信息加密放在/etc/shadow中,因此这里为x)
第三个字段:UID。(0表示账号为系统管理员,1-999表示账号为系统账号,1000-6000表示账号为一般使用者)
第四个字段:GID。(用户所在初始群组的ID号)(每个账号被创建后,都会被分配到一个初始组中)
第五个字段:用户名全称或账号意义说明。(可理解为账号的注释说明)
第六个字段:家目录。(默认为/home/账号名称)
第七个字段:账号登录系统之后取得的shell。(账号通过该shell跟linux进行交流)
/etc/shadow的文件内容:
root:$6$BOzhx0mUbB97BizQ$34NhP3GsdbmnzvLwbRqY.kU0X.qUeAC02RQJSf::0:99999:7:::
第一个字段:账号名称。
第二个字段:密码。(这里存的是加密后的密码。若密码以 "!" 开头,表示密码失效,账号被锁,暂时无法登录。)
(1)如果为空,则对应账号没有密码,登录时不需要密码。
(2)星号("*")代表账号被锁定。
(3)双叹号表示这个密码已经过期了。
(4)$6$开头的,表明是用SHA-512加密的。
(5)$1$开头的,表明是用MD5加密的。
(6)$2$开头的,表明是用Blowfish加密的。
(7)$5$开头的,表明是用SHA-256加密的。
虽然这些加密过的密码很难被解出来, 但是『很难』不等于『不会』,所以,这个档案的预设权限是『-rw-------』或者是『-r--------』,亦只有 root 才可以读写就是了!你得随时注意,不要不小心更动了这个档案的权限呢!
由于固定的编码系统产生的密码长度必须一致,因此『当你让这个字段的长度改变后,该密码就会失效(算不出来)』。 很多软件透过这个功能,在此字段前加上 ! 或 * 改变密码字段长度,就会让密码『暂时失效』了。
第三个字段:这个字段记录了『更改密码那一天』的日期。计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1
月 1 日则为 366 啦。
1970年1月1日 00:00:00 互联网的起始时间
echo $(($(date --date="2008/09/04" +%s)/86400+1)) 14126
这是在2008/09/04那天计算的,距离1970/01/01那天有多少天。
2008/09/04 为你想要计算的日期,86400 为每一天的秒数, %s 为 1970/01/01 以来累积总秒数。 由于 bash 仅支持整数,因此最终需要
加上 1 补齐 1970/01/01 当天。
echo $(($(date --date="2019/10/15" +%s)/86400+1)) 18184
这是在2019/10/15那天计算的,距离1970/01/01那天有多少天。
假如最后一次修改密码是在2019/10/15这天,那么第三个字段这里记录的就是18184,表示天数。
第四个字段:密码不可需改的天数。假如你最后一次修改密码是在2019/10/15这天,该字段设置的是7,那么在2019/10/15到2019/10/22
这段时间之内,你不能修改密码,也根本无法修改。
第五个字段:密码需要再次修改的天数。假如你最后一次修改密码是在2019/10/15,该字段设置的是30,那么在2019/11/15之前,你需要再
次修改你的密码。过了2019/11/15日,你的密码就过期了。(2019/11/15就是过期日)
经常变更密码是个好习惯!
第六个字段:在密码过期日的前几天开始发出警告。在密码过期前,提前多少天提醒用户。假如你设置的是7,那么系统会从2019/11/08日开
是发出警告,提醒你该修改密码了。
第七个字段:密码过期之后的账号宽限天数。假如该字段设置的是7,那么从过期日2019/11/15日开始,到2019/11/22日这段时间之内,你
依然可以用你的旧密码登录,但只是能登录而已。进入bash后,系统会强制让你修改密码,否则不予使用。
如果在这七天内,你依然不听劝告,坚持不改密码,那么对不起,7天之后,你的密码就失效了(等同于作废)。
在这7天内,你可以不登录,但我会保留你密码的有效性。7天之内,你要是想登录,我可以准许你登录,但是有一条,登录后,必须先改密码,
如果不改,你就无法使用系统。如果你想拖,7天之后,你的密码就作废了。
第八个字段:账号失效日期。这个字段具有专权性,它能让你的账号失效或者不失效。【账号的失效和密码的失效不是一样的概念】
2019/11/10对应18179
2019/11/15对应18184 过期日
2019/11/20对应18189
如果该字段设置18179,表示说你的账号在2019/11/10这天会作废。虽然你的密码还没有过期,但对不起,我是王,得听我的。
如果该字段设置18189,表示说你的账号在2019/11/20这天会作废。虽然给了你7天的缓冲期,但对不起,在我面前,它不起作用。
第九个字段:保留字段。
常用命令:
useradd [-u UID] [-g 初始群組] [-G 次要群組] [-m/M] [-c 账号意义说明] [-d 家目绝对路径] [-s shell] [-r] \
[-e 账号失效日期,格式为YYYY-MM-DD] [-f 密码是否会失效,0立刻失效,-1永不失效] 账号名称
-M表示强制不建立家目录,-m表示强制建立家目录,-r表示创建系统账号
-b选项:
# 创建账号zhangsan,家目录创建到/opt/目录下,也就是/opt/zhangsan
useradd -b /opt zhangsan
-c选项:
# 添加账号的同时,添加注释
useradd -b /opt -c "测试" zhangsan
cat /etc/passwd
zhangsan:x:1002:1002:测试:/opt/zhangsan:/bin/bash
-d选项:
# 明确指定家目录
useradd -c "测试-d选项" -d /home/lisi wangwu
注意:-d不能和-b一起使用。我们创建的账号是wangwu,但指定的家目录却是/home/lisi。也就是说,家目录的名字不一定要和账号名一样。
# 没有使用-b和-d,则用户的家目录创建在/home/wangwu
useradd -c "测试-d选项" wangwu
-D选项:
修改默认值。
-e选项:
账号失效日期。
useradd -e "2019-12-12" yangsilang
如果没有用-e,就使用/etc/default/useradd中的EXPIRE变量。要是没有EXPIRE变量,就使用空字符串。
-f选项:
密码过期后,再过多少天,账户就会永久禁用。
0表示当密码过期后,账户立即禁用。
-1表示不使用这个特性。也就是说,密码过期后,保留该账号直到永久。
其他的正数,则表示具体的天数。比如5表示密码过期后,再过5天,禁用该账号。
如果没有使用-f,则使用/etc/default/useradd中的INACTIVE,如果没有INACTIVE,则使用默认的-1.
-g选项:
组名或组ID。组名必须存在。
如果没有使用-g,则会参考/etc/login.defs中的USERGROUPS_ENAB变量。如果值为yes,表示创建用户的时候,同时创建组。组名就是用户名。等同于在命令行上添加选项
-U。
如果值为no,(等同于添加-N选项)则会参考/etc/default/useradd中的GROUP变量,如果没有GROUP,则使用100作为GID。
-G选项:
将用户添加到多个组中。
useradd -G group1,group2,group3 zhangsan
-G后跟的组,要参考-g选项的标准。不符合,就报错。默认是将用户放到初始组。
一般来说,我们创建用户账号的时候只要指定账号名称即可:useradd 账号名称,这样账号的其他信息都会使用系统为我们设置的默认值。
[root@localhost ~]# useradd -D # 默认值 GROUP=100 # 默认组的ID HOME=/home # 默认家目录所在目录 INACTIVE=-1 # 密码失效日 EXPIRE= # 账号失效日 SHELL=/bin/bash # 默认shell SKEL=/etc/skel # 使用者家目录的内容资料参考目录 CREATE_MAIL_SPOOL=yes # 是否建立邮件信箱,/var/spool/mail/账号名 # 这些默认参数实际上在文件/etc/default/useradd中。
useradd命令会为我们做以下这些事情:
<1> 在/etc/passwd建立一行与账号相关的资料。
<2> 在/etc/shadow建立一行与此账号密码相关的数据,但是尚未有密码。
<3> 在/etc/group建立一行此账号的初始群组信息,群组名称与账号名称一致。
<4> 在/etc/gshadow建立一行此账号初始群组的密码信息,但是没有密码。
<5> 在/home中建立此账号家目录,目录名称与账号名称一致,权限为700。
初始群组的两种机制:公共群组机制(SuSE使用)和私有群组机制(RHEL和CENTOS)。
对于公共群组机制:创建的新账号都会分配给GID为100的群组(组名为users),也就是说多个账号都在users组中。使用了GROUP=100。
对于私有群组机制:每个账号都有各自的群组和家目录,大家并不共用。没有使用GROUP=100。
/etc/default/useradd这个文件只是设置了一些账号的基本信息默认值,更多参数默认值可在/etc/login.defs文件中查看。
总结起来,使用useradd命令创建账号时会参考的文件有:/etc/default/useradd、/etc/login.defs、/etc/skel/*。
usermod
usermod -L # 冻结账号(在密码前加 "!")
usermod -U # 解冻账号(取消密码前的 "!")
userdel username
userdel -r username # 递归删除(删除家目录)
passwd # 修改密码,修改密码属性,冻结密码,解冻密码,查看密码信息
chage # 也能修改密码信息
chage [-d 最近修改密码日期,格式为YYYY-MM-DD] [-m 密码不可修改的天数] [-M 密码需要再次修改的天数] \
[-W 在密码过期日前几天开始发出警告] [-I 密码过期之后的账号失效宽限天数] [-E 账号失效日期,格式为YYYY-MM-DD]
[root@localhost ~]# chage -l yangling
Last password change : never
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
# id yangling
# finger # 查询当前登录系统的所有用户信息
# finger yangling # 查询某个用户的属性
# chfn # 修改finger中的展示信息
[root@localhost ~]# chsh -l # 查看可用的shell,内容来源于/etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
cat /etc/group
yangling:x:1000:yangling
群组名称
群组密码
GID
群组中的成员
cat /etc/gshadow
yangling:!!::yangling
群组名称
群组密码:通常给群组管理员使用,少有设置。
群组管理员的账号。
组中的成员
创建组
groupadd [-g gid] 组名
创建系统组
groupadd -r -g gid 组名
修改组名(原来的名字是A,现在改为B)
groupmod [-g gid] [-n 新组名] 旧组名
不要随意修改GID
删除组(如果组内有用户,则无法删除)
groupdel 组名
初始群组与有效群组
初始群组:用户登入系统之后就获取到并拥有其相关权限的群组。也就是/etc/passwd文件第四个栏位上的GID对应的群组。
用户可以加入多个群组。但是该用户在创建新文件或新目录的时候,新文件或新目录的群组只能是用户当前的有效群组。
有效群组:可以使用命令“groups”查看当前用户加入的所有群组,列表中第一个群组即是当前有效群组,可以使用命令“newgrp 群组名称”
切换有效群组,但是只能在当前用户加入的所有群组中切换。切换有效群组之后会进入一个新的shell环境,可以使用“exit”命令来退出,回到原来有效群组和shell环境。
用户加入群组
方法1:由root将用户加入到组中。
usermod -a -G 'groupname' username
将username加入到groupname中。
方法2:由群组管理员来添加用户到组中。
(1)用root指定群组的管理员。
修改群组密码:gpasswd groupname
设置群组管理员、用户成员:gpasswd [-A 群组管理员账号列表] [-M 用户成员账号列表] 群组名称
移除群组名称:gpasswd -r 群组名称
使群组密码失效:gpasswd -R 群组名称
gpasswd -a username groupname
将username加入到groupname中
su 账号名 # 以non-login shell方式切换,不切换环境变量
su - # 以login shell方式切换,切换环境变量
su -l # 以login shell方式切换,切换环境变量
su - -c "指令" 账号名 # 利用新身份执行一条指令,执行后身份恢复为当前用户,不指定账号时,表示切换为root身份。
使用su命令切换身份是需要输入新切换账号的密码的(只有root不需要),也就是说,若要使用su切换身份,就必须要知道新切换账号的密码
才行。另一个命令sudo也可以切换身份执行命令操作,而且只需要输入当前账号密码即可,无需知道新切换账号的密码,只是切换身份执行命令
之后会自动恢复到原来账号身份。
sudo只是切换身份执行一个命令而已,要知道自己的密码
su是切换身份,要知道新账号的密码
sudo -u 账号名 指令
以-u后的账号执行指令
没有-u时,表示以root身份执行
/etc/sudoers
哪些用户或群组可在哪些主机登入系统时切换到哪些账号执行哪些指令,还可以设置执行sudo指令时无需输入密码。