Linux账号管理(用户{创建删除修改}用户组{创建删除修改}一般用户命令{id,finger,chfn,chsh})
文章目录
- Linux账号管理
- Linux的账户和用户组
- 用户标识符:UID与GID
- 用户账号
- /etc/passwd文件结构
- /etc/shadow文件结构
- 用户组:有效与初始用户组,groups,newgr
- /etc/group文件结构
- 有效用户组与初始用户组
- groups:有效与支持用户组的观察
- newgrp:有效用户组的切换
- /etc/gshadow文件结构
- 账号管理
- useradd创建用户详解
- 使用案例
- useradd参考文件
- /etc/default/useradd配置文件详解
- /etc/login.defs配置文件详解
- passwd修改用户密码
- 使用案例
- chage
- 使用案例
- usermod
- 使用实例
- userdel
- 使用案例
- 用户功能
- id
- 使用案例
- finger
- 使用案例
- chfn
- 使用案例
- chsh
- 使用案例
- 新增与删除用户组
- groupadd
- 使用案例
- groupmod
- 使用案例
- groupdel
- 使用案例
- gpasswd:用户组管理员功能
- 使用案例
- 账号管理案例
- 任务一
- 任务二
Linux账号管理
Linux的账户和用户组
管理员的工作中,相当重要的一环就是【管理账户】。因为整个系统都是你管理,并且所有一般用户的账户申请,都必须要通过你的协助才行,所以就必须了解一下如何管理好一个服务器主机中的账号。管理Linux账号之前,我们必须了解Linux到底是如何辨别每一个用户的。
Linux是怎么辨别每一个用户的呢?
Linux是一个多用户系统,可以同时支持多个用户登录,而每个用户都有自己的身份标识,Linux通过用户ID(UID),组ID(GID)来辨别每一个用户
用户标识符:UID与GID
用户ID(UID)是一个数字,通常是从0开始分配的,0是预留的超级用户(root)的UID,1至99是系统保留的UID,100以上的UID通常是由系统管理员分配给普通用户的。每个用户的UID是唯一的,可以用来确定用户的身份
组ID(GID)也是一个数字,通常是从0开始分配的,0是预留的超级用户组(root)的GID,1至99是系统保留的GID,100以上的GID通常由系统管理员分配给用户组。每个用户组的GID是唯一的,可以用来确定用户组的身份
用户账号
Linux系统上面的用户如果需要登录主机以获取shell的环境来工作时,它需要如何进行呢?首先它必须要在 计算机前面利用tty1~tty6的终端提高的登录接口,并输入账号与密码才能够登录。那么你输入了账号密码,系统帮你处理了什么呢?
- 先查找/etc/passwd 里面是否有你的账号?如果没有则退出,如果有的话则将该账号对应的UID与GID(/etc/group中)读出来,另外,该账号的家目录与shell也一并读出
- 再来就是核对密码表,这时Linux会进入/etc/shadow里面找出对应的账号与UID,然后进行核对你刚刚输入的密码与里面的密码是否相符
- 如果一切都OK的话,就要进入shell管理的阶段
现在你大致知道系统帮你处理了什么了吧,以上还提到了两个非常重要的文件,一个是管理用户UID与GID重要参数的/etc/passwd,另一个是专门管理密码数据的/etc/shadow。接下里我们介绍以下这两个文件
/etc/passwd文件结构
这个文件结构是这样的:每一行都代表一个账号,有几行就代表有几个账号在你系统里。不过需要特别留意的是,里面有很多账号本来就是系统正常运行所必需的,我们简称系统账号,例如:bin、daemon、adm等,这些账户不要随意删除.
[root@localhost ~]# head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
我们先来看一下每一个Linux系统都会有的1行,就是root这个系统管理员那一行。你可以明显的看出来,每一行用【:】分隔开,共有7个字段分别表示的是:
字段 | 解释 |
---|---|
账户名称 | 该字段代表用户账号的名称,通常由字母、数字和下划线组成。该字段不能包含冒号( : )。 |
密码 | 该字段代表用户账号的密码,通常是加密后的密码,而不是明文密码。如果该字段为空,则表示该用户没有密码,可以直接登录系统。如果该字段为x,则表示密码存储在/etc/shadow文件中 |
UID | 该字段代表用户账号的唯一标识符,通常是一个数字。UID为0的用户是超级用户(root),1~999都是系统账户,其他用户的UID从1000开始分配 |
GID | 该字段代表用户所属的主要用户组的唯一标识符,通常是一个数字。用户可以属于多个用户组,但只有一个是主要用户组 |
用户信息说明栏 | 该字段是一个可选字段,通常包含有关用户的描述信息。 |
家目录 | 该字段代表用户的家目录,通常用于存储用户的文件和配置信息 |
shell | 该字段代表用户的默认Shell程序,用于提供用户与系统交互的界面。 |
/etc/shadow文件结构
/etc/shadow文件是存储用户账号密码信息的文件。该文件的每一行都代表一个用户账号,由多个字段组成,每个字段用冒号(:)隔开。以下是/etc/shadow文件的结构详解:
[root@localhost ~]# head -n 5 /etc/shadow
root:$6$0x0W5U0lAIGfNePS$fQegjEeiYdvyV7xK7zyhR9jsXzAwkB6XoA6RxpGo0X/uz8uPhblK9frf36sRtpdyNgJY4jZPQplMR1b/Hqgb9/::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
字段 | 解释 |
---|---|
账户名称 | 该字段代表用户账号的名称,与/etc/passwd文件中的用户名字段相同。 |
密码 | 该字段代表用户账号的密码,通常是加密后的密码。如果用户没有密码,则该字段为空。 |
最后一次修改密码的日期 | 该字段代表用户最后一次修改密码的日期,通常是从1970年1月1日起的天数。 |
密码过期时间 | 该字段代表密码的过期时间,通常是从1970年1月1日起的天数。如果该字段为0,则表示密码永不过期。 |
密码过期前的警告天数 | 该字段代表密码过期前给用户的警告天数。例如,如果该字段为7,则表示在密码过期前7天给用户一个警告提示。 |
密码过期后的宽限天数 | 该字段代表密码过期后给用户的宽限天数。例如,如果该字段为7,则表示在密码过期后7天内仍然允许用户使用旧密码登录系统。 |
密码失效日期 | 该字段代表密码失效的日期,通常是从1970年1月1日起的天数。如果该字段为-1,则表示密码已失效。 |
账号失效日期 | 该字段代表账号失效的日期,通常是从1970年1月1日起的天数。如果该字段为-1,则表示账号已失效。 |
保留字段 | 该字段是一个保留字段,目前没有使用。 |
用户组:有效与初始用户组,groups,newgr
知道了账号相关的两个文件/etc/passwd/和/etc/shadow之后,接下里我们要了解用户组的配置文件:/etc/group与/etc/gshadow
/etc/group文件结构
这个文件是在记录GID与组名的对应记录
[root@localhost ~]# head -n 5 /etc/group
root:x:0:
bin:x:1:root,bin,daemon
daemon:x:2:
sys:x:3:
adm:x:4:
# 其中
# 第一行表示root用户组,GID为0,没有密码,没有成员
# 第二行表示bin用户组,GID为1,密码为x,成员包括root、bin和daemon
字段 | 解释 |
---|---|
用户组名 | 用户组的名称,长度不超过32个字符,不能包含冒号和逗号等特殊字符。 |
用户组密码 | 用户组密码,如果为空则表示没有密码。 |
GID | 用户组ID,是一个非负整数,唯一标识一个用户组。 |
组内成员 | 该用户组包含的用户列表,用逗号分隔。如果该用户组没有成员,则该字段为空。 |
因为每个用户都可以拥有多个用户组,这就好比在学习读书的时候加入多个社团。不过在这里就很奇怪了,那就是【假如我同时加入多个用户组,那我在写作业的时候,到底是以哪个用户为准呢?】下面我们来介绍有效用户组
有效用户组与初始用户组
还记得每个用户在它的/etc/passwd里面的第四个字段有个所谓的GID吧,那个GID就是所谓的【初始用户组】
。
该命令会列出用户的主用户组名称。用户可以通过修改/etc/passwd文件来改变主用户组,例如:
[root@localhost ~]# usermod -a -G users zhw # 先设置好次要用户组
[root@localhost ~]# grep zhw /etc/passwd /etc/group /etc/gshadow
/etc/passwd:zhw:x:1001:1001::/home/zhw:/bin/bash
/etc/group:users:x:100:zhw # 次要用户组的设置
/etc/group:zhw:x:1001: # 因为是初始用户组,所以第四个字段不需要填入账号
/etc/gshadow:users:::zhw # 次要用户组的设置
/etc/gshadow:zhw:!::
在上述例子中,因为我的zhw账号同时支持zhw和users这两个用户组,因此,在读取,写入执行文件时,针对用户组部分,只要是users与zhw这个两个用户组拥有的功能,zhw这个用都能够拥有。不过这是针对已存在的文件而言,如果今天要建立一个新的文件或是新的目录,那么新文件的用户组是zhw还users呢?这就要检查以下有效用户组了
groups:有效与支持用户组的观察
如果我以zhw这个用户组的身份登录后,该如何知道我所有支持的用户组?很简单直接输入groups就可以了
注意:group 有加 s
[zhw@localhost ~]$ groups
zhw users
这个输出信息中,知道了zhw这个用户同时属于zhw和users这三个用户组,而且,第一个输出的用户组即有效用户组。也就是说 ,我此时去touch创建一个文件,那么这个文件拥有者为zhw用户组也是zhw
[zhw@localhost ~]$ ls -l zhw.txt
-rw-rw-r--. 1 zhw zhw 0 4月 10 10:37 zhw.txt
通常有效用户组的作用是新建文件,那么有效用户组是否能够变换?
newgrp:有效用户组的切换
那么如何修改有效用户组呢?newgrp命令用于切换用户的有效用户组,使用户可以使用其他用户组的权限访问文件和目录。在执行newgrp命令时,系统会判断用户是否已经属于该用户组,如果是则直接切换到该用户组,否则需要用户输入该用户组的密码才能切换到该用户组。如果用户没有权限切换到该用户组,则会出现“permission denied”错误。
[zhw@localhost ~]$ newgrp users
[zhw@localhost ~]$ groups
users zhw
[zhw@localhost ~]$ touch users.txt
[zhw@localhost ~]$ ll *.txt
总用量 0
-rw-r--r--. 1 zhw users 0 4月 10 10:42 users.txt
-rw-rw-r--. 1 zhw zhw 0 4月 10 10:37 zhw.txt
[zhw@localhost ~]$ exit # 注意记得退出newgrp的环境
/etc/gshadow文件结构
/etc/gshadow文件是Linux系统中的一个重要文件,用于存储用户组的加密密码和其他安全相关信息。该文件只有root用户可以访问和修改,其结构如下:
[root@localhost ~]# head -n 5 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
字段 | 解释 |
---|---|
组名称 | 与/etc/group文件相同 |
组密码 | 与/etc/passwd文件中的密码字段相似,但是它是加密的 |
组管理员列表 | 组管理员列表,由逗号分隔的用户名列表,指定可以管理该组的用户 |
组成员列表 | 组成员列表,由逗号分隔的用户名列表,指定该组的普通成员 |
账号管理
useradd创建用户详解
要如何在Linux中新增一个用户呢?非常简单,我们登录系统时会输入(1)账号(2)密码,所以建立一个可用的账号同样的也需要这两个数据,账号可以使用useradd来新建,密码则使用passwd这个命令设置。这两个命令的执行方法如下
useradd [选项] 用户名
选项与参数:
-u # 后面接的是UID,是一组数字,直接指定一个特定的UID给这个账号
-g # 后面接的是用户组就是上面提到的初始用户组,该用户组的GID会被放到/etc/passwd第四个字段内
-M # 强制,不要建立使用者家目录(系统账号默认值)
-m # 强制,要建立使用者的家目录(一般账号默认值)
-c # 这个就是/etc/passwd的第五个字段的说明内容,可以随便我们设置
-d # 指定某个目录成为家目录,而不要使用默认值,务必使用绝对路径
-r # 建立一个系统账号,这个账号的UID会有限制(参考/etc/login.defs)
-e # 后面借一个日期,格式为【YYYY-MM-DD】此选项可写入shadow第八个字段,就是设置账号失效日的选项
-f # 后面接shadow的第七字段位选项,指定密码是否会失效,0为立刻失效,-1为永不失效(密码只会过期后强制于登录时重新设置而已)
其实系统已经帮我们规定好了非常多的默认值了,所以我们可以简单地使用【useradd 账号】来建立账户。centos默认值如下
- 在/etc/passwd里面建立一行与账户相关的数据,包括建立UID/GID/家目录等
- 在/etc/shadow里面将此账号的密码相关参数写入,但是尚未有密码
- 在/etc/group 里面加入一个与账号名称一模一样的组名
- 在/home下面建立一个与账号同名的目录作为用户家目录,且权限为700
使用案例
完全参考默认值建立一个使用者,名称为csr
[root@localhost ~]# ll -d /home/csr
drwx------. 2 csr csr 62 4月 10 15:18 /home/csr
# 默认会建立使用者的家目录,且权限为700,这个是重点
[root@localhost ~]# grep csr /etc/passwd /etc/shadow /etc/group
/etc/passwd:csr:x:1002:1002::/home/csr:/bin/bash
/etc/shadow:csr:!!:19457:0:99999:7:::
/etc/group:csr:x:1002: <== 默认会建立一个与账号一模一样的用户组名
假设我们已经知道我的系统中有个用户组名称为users,且UID1500并不存在,请用users为初始用户组,以及uid为1500来建立一个名为csr2的账号
[root@localhost ~]# useradd -u 1500 -g users csr2
[root@localhost ~]# ll -d /home/csr2/
drwx------. 2 csr2 users 62 4月 10 15:31 /home/csr2/
[root@localhost ~]# grep csr2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:csr2:x:1500:100::/home/csr2:/bin/bash
/etc/shadow:csr2:!!:19457:0:99999:7:::
# UID与初始用户组确实修改成我们需要的了
建立一个系统账号,名称为csr3
[root@localhost ~]# useradd -r csr3
[root@localhost ~]# ll -d /home/csr3
ls: 无法访问/home/csr3: 没有那个文件或目录
[root@localhost ~]# grep csr3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:csr3:x:997:995::/home/csr3:/bin/bash
/etc/shadow:csr3:!!:19457::::::
/etc/group:csr3:x:995:
# 一般账号UID应该是1000以后了,系统UID则一般小于1000
# 然后就会有些人问啊为什么没有家目录呢?
# 这个是由于系统账号主要是用来执行系统所需服务的权限设置,所以系统账号默认都不会主动创建家目录
useradd参考文件
/etc/default/useradd配置文件详解
你想过这样一个问题没有为什么 【usradd csr1】 会主动在/home/csr1建立起家目录?家目录内容有什么数据且来自哪里?为何默认使用的是/bin/bash这个shell呢?为什么密码字段已经都规范好了呢(0:99999:7那一串)?这里我们就要介绍以下useradd所使用的配置文件
[root@localhost ~]# useradd -D
GROUP=100 <== 默认的用户组
HOME=/home <== 默认的家目录所在目录
INACTIVE=-1 <== 密码失效日,在shadow内的第7字段
EXPIRE= <== 账户失效日,在shadow内的第8字段
SHELL=/bin/bash <== 默认的shell
SKEL=/etc/skel <== 使用者家目录的内容数据参考目录
CREATE_MAIL_SPOOL=yes <== 是否主动帮助使用者建立邮箱(mailbox)
这些数据其实是由/etc/default/useradd 调用出来的,i可以自行用vim去查看该文件的内容。
下面是该文件的配置及其含义:
- GROUP:新建账户的初始用户使用GID为100
- HOME:新建用户的主目录,默认值为/home。
- INACTIVE:新建用户账户不活动的天数,默认值为-1,表示永不失效。
- EXPIRE:新建用户账户的过期时间,默认值为空,表示永不过期。
- SHELL:新建用户的默认Shell,默认值为/bin/bash。
- SKEL:指定一个目录,将该目录中的文件和目录作为新建用户的模板。
- CREATE_MAIL_SPOOL:设置为yes时,新建用户同时创建邮件存储目录(/var/spool/mail/用户名称)
/etc/login.defs配置文件详解
除了这些基本的账号设置值之外,UID/GID的密码参数有时在哪里参考呢?那就要看看/etc/login.defs,这个文件了
可以将文件预处理以下
:%g/^#/d 删除#开头的注释行
:%g/^$/d 删除空行
MAIL_DIR /var/spool/mail # 使用者默认邮箱放置目录
PASS_MAX_DAYS 99999 # /etc/shadow内的第五个字段,单位为天。如果超过该期限,用户将被要求更改密码。默认值为 99999,表示永不过期。
PASS_MIN_DAYS 0 # /etc/shadow内的第4个字段,该选项用于设置用户更改密码的最短间隔时间,即用户必须在该时间间隔后才能再次更改密码。默认值为 0,表示可以立即更改密码
PASS_MIN_LEN 5 # 密码最短的字符长度,已被pam模块替换,已经弃用该参数
PASS_WARN_AGE 7 # /etc/shadow内的第6个字段,该选项用于设置用户密码过期前的警告时间,单位为天。如果设置为 7,则表示用户密码将在过期前 7 天收到警告通知。默认值为 7
UID_MIN 1000 # 使用者最小的UID,意思就是小于1000的UID为系统保留
UID_MAX 60000 # 使用者能够用的最大UID
SYS_UID_MIN 201 # 保留给使用者自行设置的系统账号最小值UID
SYS_UID_MAX 999 # 保留给使用者自行设置的系统账号最大值UID
GID_MIN 1000 # 使用者自定义用户组的最小GID,小于1000为系统保留
GID_MAX 60000 # 使用者自定义用户组的最大GID
SYS_GID_MIN 201 # 保留给使用者自行设置的系统账号最小值GID
SYS_GID_MAX 999 # 保留给使用者自行设置的系统账号最大值GID
CREATE_HOME yes # 在不加-M及-m时,是否主动建立使用者家目录?
UMASK 077 # 使用者家目录建立的umask,因此权限会是700
USERGROUPS_ENAB yes # 使用userdel删除时,是否会删除初始用户组
ENCRYPT_METHOD SHA512 # 密码加密的机制使用的是SHA-512
现在你知道,使用useradd这个程序在建立Linux上的账号时,至少会参考:
- /etc/default/useradd
- /etc/login.defs
- /etc/skel/*
不过最重要的其实是建立/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow 还有用户家目录。了解了这些文件我们接下来就可以处理一下用户的密码了
passwd修改用户密码
刚刚我们讲到了,使用useradd建立了账号后,在默认情况下,该账号是暂时被锁定的,也就是说,该账号无法登录的!!!,我们可以使用passwd命令给他设置新密码就好了
passwd [选项] [账号名称]
> [-n 日数][-x 人数][-w 日数][-i 日期] 这些参数只有root能设置
选项参数
--stdin 可以通过来自前一个管道的数据,作为密码输入,对shell脚本有帮助
-l 是lock的意思,会将/etc/shadow 第二个字段前面加上!使密码失效
-u 与-l相对,是Unlock的意思
-S(大写) 列出密码相关参数,即shadow文件内地大部分信息
-n 后面接天数,shadow的第4字段,多久不可修改密码天数
-x 后面接天数,shadow的第5字段,多久内必须要修改密码
-w 后面接天数,shadow的第6字段,密码过期前的警告天数
-i 后面接日期,shadow的第7字段,密码失效日期
使用案例
请root设置csr的密码
[root@localhost ~]# passwd csr
更改用户 csr 的密码 。
新的 密码: <== 这里直接输入新密码,屏幕不会有任何反应
无效的密码: 密码是一个回文 <== 密码太简单重新输入
重新输入新的 密码: <== 再输入一次同样的密码
passwd:所有的身份验证令牌已经成功更新。 <== 竟然修改成功了
当我要设置短密码的时候,可以使用root设置,那如果是用户自己要该密码呢?
[csr@localhost ~]$ passwd <== 后面不加账号就是改自己的密码
更改用户 csr 的密码 。
为 csr 更改 STRESS 密码。
(当前)UNIX 密码: <== 输入旧密码
新的 密码: <== 输入新密码
无效的密码: 密码是一个回文 <== 提示密码太短
新的 密码: <== 重新输入
无效的密码: 密码是一个回文 <== 还是不行
新的 密码: <==输入难一点的密码
重新输入新的 密码: <==重新输入
passwd:所有的身份验证令牌已经成功更新。 <== 设置成功了!
你的密码最好符号如下要求:
- 密码不能与账号相同
- 密码尽量不要选用字段里面会出现的字符串
- 密码需要超过8个字符
- 密码不要使用简单的关系式,如1+1=2,iloveyou等等
- 密码尽量使用大小写字符、数字、特殊字符($、-、_等)的组合
使用–stdin建立用户的密码
[root@localhost ~]# echo "abc123789456ABC" |passwd --stdin csr
更改用户 csr 的密码 。
passwd:所有的身份验证令牌已经成功更新。
让csr每60天需要修改密码,密码过期后10天未使用就声明账号失效
[root@localhost ~]# passwd -S csr
csr PS 2023-04-10 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
[root@localhost ~]# passwd -x 60 -i 10 csr
调整用户密码老化数据csr。
passwd: 操作成功
[root@localhost ~]# passwd -S csr
csr PS 2023-04-10 0 60 7 10 (密码已设置,使用 SHA512 算法。)
让csr账户失效,查看完毕后再让他失效
[root@localhost ~]# passwd -l csr
锁定用户 csr 的密码 。
passwd: 操作成功
[root@localhost ~]# passwd -S csr
csr LK 2023-04-10 0 60 7 10 (密码已被锁定。)
[root@localhost ~]# grep csr /etc/shadow
csr:!!$6$aUlf83nj$Oen9IE2eFsjOhMLyRa011SjfvJhntvgypiSra1BMyyu9vUqtlB7.4gOU6pG8qpm/h38XvcPu31lDRNM9OtlOd0:19457:0:60:7:10::
csr2:!!:19457:0:99999:7:::
csr3:!!:19457::::::
[root@localhost ~]# passwd -u csr
解锁用户 csr 的密码。
passwd: 操作成功
[root@localhost ~]# grep csr /etc/shadow
csr:$6$aUlf83nj$Oen9IE2eFsjOhMLyRa011SjfvJhntvgypiSra1BMyyu9vUqtlB7.4gOU6pG8qpm/h38XvcPu31lDRNM9OtlOd0:19457:0:60:7:10::
csr2:!!:19457:0:99999:7:::
csr3:!!:19457::::::
chage
除了使用passwd -S之外,有没有更详细的密码参数显示功能呢?有就是chage了,用法如下
chage [options] username
选项参数:
-l 列出该账号的详细密码参数
-d 后面接日期,修改shadow 第三个字段(最近一次修改密码的日期)格式为YYYY-MM-DD
-m 后面接日期,修改shadow 第四个字段(密码最短保留天数)
-M 后面接日期,修改shadow 第五个字段(密码多久需要进行修改)
-W 后面接日期,修改shadow 第六个字段(密码过期前警告日期)
-I 后面接日期,修改shadow 第七个字段(密码失效日期)
-E 后面接日期,修改shadow 第八个字段(账户失效日)格式为YYYY-MM-DD
使用案例
列出csr的详细密码参数
[root@localhost ~]# chage -l csr
最近一次密码修改时间 :4月 10, 2023
密码过期时间 :4月 11, 2023
密码失效时间 :4月 21, 2023
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :1
两次改变密码之间相距的最大天数 :1
在密码过期之前警告的天数 :7
建立一个名为agetest的账号,该账号第一次登录后使用默认密码,但必须要修改过密码,使用新密码才能登录系统使用bash环境
[root@localhost ~]# useradd agetest
[root@localhost ~]# echo "agetestABC123"| passwd --stdin agetest
更改用户 agetest 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# chage -d 0 agetest
[root@localhost ~]# chage -l agetest |head -n 3
最近一次密码修改时间 :密码必须更改
密码过期时间 :密码必须更改
密码失效时间 :密码必须更改
# 此时账号的密码建立时间会被改为1970/1/1,所以会有问题
尝试登录agetest
连接成功
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
更改用户 agetest 的密码 。
为 agetest 更改 STRESS 密码。
(当前)UNIX 密码: <<== 这个账号被强制性要求改密码
usermod
usermod是Linux系统中用来修改用户账号信息的命令,可以用来修改用户的用户名、用户ID、所属组、家目录、登录Shell等信息。其语法如下:
usermod [选项] [username]
选项参数:
-c 后面接账号的说明,即/etc/passwd第五字段,可以加入一些账号的说明
-d 后面接账号的家目录,即修改/etc/passwd的第六字段
-e 后面接日期,格式是YYYY-MM-DD 也就是在/etc/shadow被的第八个字段内容
-f 后面接天数,为shadow第七个字段
-g 后面接初始用户组,修改/etc/passwd的第四个字段,就是修改GID
-aG 用于将用户添加到一个或多个附加组中。该选项后面需要指定一个或多个组名,用逗号分隔。这将使用户成为这些组的成员,并且可以在这些组中具有相应的权限。
-l 后面接账号名称,就是修改账户的名称,/etc/passwd的第一个字段
-u 后面接UID数字,即/etc/passwd第三字段的数据
-s 后面接shell的实际文件,例如/bin/bash或/bin/csh等
-L 暂时将使用者的密码冻结,让他无法登录,其实仅改/etc/shadow的密码字段
-U 将/etc/shadow密码字段的感叹号(!)拿掉,解锁。
-p 用于设置用户的密码,选项后面需要跟着加密后的密码。
使用实例
修改使用者csr的说明字段,加上【i am csr】的说明
[root@localhost ~]# usermod -c "i am csr" csr
[root@localhost ~]# grep csr /etc/passwd
csr:x:1002:1002:i am csr:/home/csr:/bin/bash
...
使用者csr这个账号在2023年4月10日失效
[root@localhost ~]# usermod -e "2023-04-10" csr
[root@localhost ~]# chage -l csr |head -n 4
最近一次密码修改时间 :4月 10, 2023
密码过期时间 :4月 11, 2023
密码失效时间 :4月 21, 2023
帐户过期时间 :4月 10, 2023
建立zhw3这个系统账号时没有设置家目录,请建立它的家目录
[root@localhost home]# mkdir zhw3
[root@localhost home]# ll -d zhw3
drwxr-xr-x. 2 root root 6 4月 10 20:40 zhw3
[root@localhost home]# chown zhw3:zhw3 zhw3
[root@localhost home]# ll -d zhw3
drwxr-xr-x. 2 zhw3 zhw3 6 4月 10 20:40 zhw3
[root@localhost home]# chmod 700 zhw3
[root@localhost home]# ll -d zhw3
drwx------. 2 zhw3 zhw3 6 4月 10 20:40 zhw3
[root@localhost home]# usermod -d /home/zhw3 zhw3
[root@localhost home]# grep zhw3 /etc/passwd
zhw3:x:1502:1502::/home/zhw3:/bin/bash
userdel
这个功能就很简单了,目的就是删除用户的相关数据,而用户的数据有:
- 用户账号/密码相关参数:/etc/passwd、/etc/shadow
- 用户组相关参数:/etc/group、 /etc/gshadow
- 用户个人文件数据:/home/username、/var/spool/mail/username
整个命令的语法很简单:
userdel [选项] [username]
选项参数:
-r 连同使用者的家目录一起删除
使用案例
删除csr,连同家目录一起删了
[root@localhost home]# userdel -r agetest
[root@localhost home]# ls /home/agetest
ls: 无法访问/home/agetest: 没有那个文件或目录
用户功能
useradd、usermod、userdel都是系统管理员能够使用的命令,如果我是一般用户呢?那么我除了密码之外就无法修改其他数据?当然不是,这里我们介绍一下一般用户常用的账户数据修改与查询命令
id
id [usrename]
使用案例
查看root自己的相关ID信息
[root@localhost home]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 这行信息显示了UID/GID以及支持的所以用户组
查看一下zhw3
[root@localhost home]# id zhw3
uid=1502(zhw3) gid=1502(zhw3) 组=1502(zhw3)
# 这条命令也可以用做查系统的账号
[root@localhost home]# id car
id: car: no such user
# 表示系统没有这个账号
finger
finger命令用于显示用户的登录信息和详细信息,包括用户的登录名、全名、登录Shell等
centos7默认是没有finger这个命令,需要咋们手动安装
yum install -y finger
使用方法如下
finger [选项] [username]
选项:
-s 只显示用户的登录状态信息,不显示详细信息。
-m 列出与后面接的账号相同者,而不是利用部分比对(包括全面部分)
使用案例
查看zhw3的使用者相关账号属性
[root@localhost home]# finger zhw3
Login: zhw3 Name:
Directory: /home/zhw3 Shell: /bin/bash
Never logged in.
No mail.
No Plan.
其实finger列出来的几乎都是/etc/passwd文件里面的东西,列出的信息说明如下
- Login:为用户账号,即/etc/passwd内的第一字段
- Name:为全名,即/etc/passwd内的第五字段(或称为注释)
- Directory:就是家目录
- Shell:就是使用的Shell文件所在
- Never logged in:finger还会调查用户登录主机的情况
- No mail:调查/var/spool/mail 当中的邮箱数据
- No Plan:表示该用户没有设置计划表,这也可以作为一种提示,告诉其他用户该用户没有特别的安排或计划
利用zhw建立自己的计划文件
[zhw@localhost ~]$ echo "i love you you love i i bu zhi dao" > ~/.plan
[zhw@localhost ~]$ finger zhw
Login: zhw Name:
Directory: /home/zhw Shell: /bin/bash
Last login 一 4月 10 21:14 (CST) on pts/0
No mail.
Plan:
i love you you love i i bu zhi dao
找出目前在系统上面登录的使用者与登录时间
[zhw@localhost ~]$ finger
Login Name Tty Idle Login Time Office Office Phone Host
root root pts/0 Apr 10 19:49 (192.168.100.1)
root root pts/1 1:26 Apr 10 19:49 (192.168.100.1)
在上述实例中,我们发现输出的信息有office、office Phone等,那么这些信息要如何记录呢?下面我们来介绍chfn这个命令,来看看如何修改用户的finger数据
chfn
chfn [选项] [username]
选项参数:
-f 后面接完整的大名
-o 您办公室的房间号码
-p 办公室的电话号码
-h 家里的电话号码
使用案例
zhw自己修改一下自己的相关信息
[zhw@localhost ~]$ chfn
Changing finger information for zhw.
名称 []: zhw # 输入想呈现的全名
办公 []: 137 # 办公室号码
办公电话 []: 137 # 办公室电话
住宅电话 []: 520 # 家里的电话
密码: # 确认身份,输入自己的密码
Finger information changed.
[zhw@localhost ~]$ grep zhw /etc/passwd
zhw:x:1001:1001:zhw,137,137,520:/home/zhw:/bin/bash
zhw3:x:1502:1502::/home/zhw3:/bin/bash
[zhw@localhost ~]$ finger zhw
Login: zhw Name: zhw
Directory: /home/zhw Shell: /bin/bash
Office: 137, 137 Home Phone: 520
Last login 一 4月 10 21:22 (CST) on pts/0
No mail.
Plan:
i love you you love i i bu zhi dao
这个命令说实在的,除非是你的主机有很多用户,否则真用不到这个程序,不过玩玩也是可以的
chsh
chsh [选项]
选项参数:
-l 列出目前系统上面可用的shell,其实就是/etc/shells的内容
-s 设置修改自己的shell
使用案例
用zhw的身份列出系统上所以合法的shell,并且指定csh为自己的shell
[zhw@localhost ~]$ chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[zhw@localhost ~]$ chsh -s /bin/sh
Changing shell for zhw.
密码:
Shell changed.
[zhw@localhost ~]$ grep zhw /etc/passwd
zhw:x:1001:1001:zhw,137,137,520:/home/zhw:/bin/sh
zhw3:x:1502:1502::/home/zhw3:/bin/bash
[zhw@localhost ~]$ chsh -s /bin/bash
Changing shell for zhw.
密码:
Shell changed.
[zhw@localhost ~]$ grep zhw /etc/passwd
zhw:x:1001:1001:zhw,137,137,520:/home/zhw:/bin/bash
zhw3:x:1502:1502::/home/zhw3:/bin/bash
不论是chfn与chsh,都能够让一般用户修改/etc/passwd这个系统文件。所以这两个文件是什么权限?显而易见是SUID的权限
新增与删除用户组
已经了解了新增、删除、修改、查询后,再来了解以下用户组的相关内容,基本上,用户组的内容都与这两个文件有关/etc/group,/etc/gshadow,用户组的内容其实很简单,都是上面两个文件的新增,修改与删除而已
groupadd
groupadd [选项] [用户组名称]
选项参数:
-g 后面接某个特定的GID,用来直接设置某个GID
-r 建立系统用户组、与/etc/login.defs 内的GID_MIN有关
使用案例
新建一个用户组,名称为group1
[root@localhost home]# groupadd group1
[root@localhost home]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1503:
/etc/gshadow:group1:!::
# 的GID也是会由1000以上最大GID + 1来决定
groupmod
groupmod [选项] [用户组名]
选项:
-g 修改既有GID的数字
-n 修改既有的用户组的名称
使用案例
将刚刚上面的命令创建的group1名称改为mygroup,GID为201
[root@localhost home]# groupmod -g 201 -n mygroup group1
[root@localhost home]# grep mygroup /etc/group /etc/gshadow
/etc/group:mygroup:x:201:
/etc/gshadow:mygroup:!::
groupdel
groupdel [用户组名]
使用案例
将刚刚的mygroup删除
[root@localhost home]# groupdel mygroup
若要删除zhw这个用户组的话?
[root@localhost ~]# groupdel zhw
groupdel:不能移除用户“zhw”的主组
为什么不能删除zhw这个用户组呢?这是因为在你尝试删除名为“zhw”的用户组时,该组被分配为用户“zgw”的主组。在删除组之前,你需要将该组从该用户的主组中删除,或者将该用户分配到另一个主组中。
gpasswd:用户组管理员功能
如果系统管理员太忙碌了,导致某些账号想要加入某个选项时找不到人帮忙,这个时候可以建立【用户组管理员】,什么是用户组管理员呢?就是让用户具有一个管理员的权限管理某些账号。那如何【建立一个用户组管理员呢】?就得要通过gpasswd。
gpasswd [选项] groupname
选项:
若没有设置参数,就表示设置groupname密码(/etc/gshadow)
-a:添加用户到组中;
-d:从组中删除用户;
-M:将一个成员列表分配给组;
-r:删除组密码;
-R:设置组的密码检查间隔;
-A:指定允许管理组的用户列表。
使用案例
建立一个新用户组,名称为testgroup且用户组交由zhw管理
[root@localhost ~]# groupadd testgroup # 创建用户组testgroup
[root@localhost ~]# gpasswd testgroup # 设置testgroup的密码
正在修改 testgroup 组的密码
新密码:
请重新输入新密码:
[root@localhost ~]# gpasswd -A zhw testgroup # 加入用户组管理员为zhw
[root@localhost ~]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:1503:
/etc/gshadow:testgroup:$6$WgdumCsI582$vkOO8AH5BxyN8nNsZOpsH96ghbyBjzNGpiJBmzxlIbWBXsyiu5FXF.JSqXTUd/B7D7ohhFFIgWzga6krJ6NOR.:zhw: #此时zhw则拥有testgroup的控制权
以zhw登录系统,并且让它加入csq,csr2成为testgroup的成员
[zhw@localhost ~]$ gpasswd -a csq testgroup
正在将用户“csq”加入到“testgroup”组中
[zhw@localhost ~]$ gpasswd -a zhw3 testgroup
正在将用户“zhw3”加入到“testgroup”组中
[zhw@localhost ~]$ grep testgroup /etc/group
testgroup:x:1503:csq,zhw3
上述实验是让testgroup成为一个可以公开的用户组,然后建立起用户组管理员,用户组管理员可以有多个。上述案例我将zhw设置为testgroup的用户组管理员,所以zhw可以自行增加用户组成员。然后该用户组成员就能够使用newgrp
账号管理案例
任务一
账号管理不是随意创建几个账号就好了,有时候我们需要考虑到一台主机上面可能有多个账号在协同工作。比如说,在某学校的实习生要分组,这些同一组的同学间必须要能够互相修改对方的数据文件,但是同时这些同学又需要保留自己的私密数据,因此直接公开家目录是不适宜的。那该如何是好呢?
任务一:单纯完成上面交代的任务,假设我们需要的账号数据如下,你该怎么做?
账号名称 | 账号全名 | 支持次要用户组 | 是否可以登录主机 | 密码 |
---|---|---|---|---|
myuser1 | no.1 user | mygroup1 | 可以 | password |
myuser2 | no.2 user | mygroup2 | 可以 | password |
myuser3 | no.3 user | 无额外支持 | 不可以 | password |
处理方法如下
# 先处理账号相关的属性数据
[root@localhost ~]# groupadd mygroup1
[root@localhost ~]# useradd -G mygroup1 -c "no.1 user" myuser1
[root@localhost ~]# useradd -G mygroup1 -c "no.2 user" myuser2
[root@localhost ~]# useradd -c "no.3 user" -s /sbin/nologin myuser3
# 在处理账号的密码相关属性的数据
[root@localhost ~]# echo "password" |passwd --stdin myuser1
更改用户 myuser1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# echo "password" |passwd --stdin myuser2
更改用户 myuser2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# echo "password" |passwd --stdin myuser3
更改用户 myuser3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
任务二
我的用户pro1、pro2、pro3是同一个项目计划的开发人员,我想要让这三个用户在同一个目录下面工作,但这三个用户还是拥有自己的家目录与基本的私有用户组。假设我要让这个项目计划在/srv/projecta目录下面开发,可以如何进行?
# 假设三个账号都为建立,可先建立名为projecta的用户组,再让三个用户加入到次要用户组中
[root@localhost ~]# groupadd projecta
[root@localhost ~]# useradd -G projecta -c "projecta user" pro1
[root@localhost ~]# useradd -G projecta -c "projecta user" pro2
[root@localhost ~]# useradd -G projecta -c "projecta user" pro3
[root@localhost ~]# echo "password" | passwd --stdin pro1
更改用户 pro1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# echo "password" | passwd --stdin pro2
更改用户 pro2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# echo "password" | passwd --stdin pro3
更改用户 pro3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
# 开始建立此项目的开发目录
[root@localhost ~]# mkdir /srv/projecta
[root@localhost ~]# chgrp projecta /srv/projecta/
[root@localhost ~]# chmod 2770 /srv/projecta/
[root@localhost ~]# ll -d /srv/projecta/
drwxrws---. 2 root projecta 6 4月 11 09:02 /srv/projecta/
本文参考《鸟哥的Linux私房菜》这本书