当前位置: 首页 > article >正文

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的终端提高的登录接口,并输入账号与密码才能够登录。那么你输入了账号密码,系统帮你处理了什么呢?

  1. 先查找/etc/passwd 里面是否有你的账号?如果没有则退出,如果有的话则将该账号对应的UID与GID(/etc/group中)读出来,另外,该账号的家目录与shell也一并读出
  2. 再来就是核对密码表,这时Linux会进入/etc/shadow里面找出对应的账号与UID,然后进行核对你刚刚输入的密码与里面的密码是否相符
  3. 如果一切都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 410 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 410 10:42 users.txt
-rw-rw-r--. 1 zhw zhw   0 410 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 410 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 410 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去查看该文件的内容。

下面是该文件的配置及其含义:

  1. GROUP:新建账户的初始用户使用GID为100
  2. HOME:新建用户的主目录,默认值为/home。
  3. INACTIVE:新建用户账户不活动的天数,默认值为-1,表示永不失效。
  4. EXPIRE:新建用户账户的过期时间,默认值为空,表示永不过期。
  5. SHELL:新建用户的默认Shell,默认值为/bin/bash。
  6. SKEL:指定一个目录,将该目录中的文件和目录作为新建用户的模板。
  7. 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 410 20:40 zhw3
[root@localhost home]# chown zhw3:zhw3 zhw3
[root@localhost home]# ll -d zhw3
drwxr-xr-x. 2 zhw3 zhw3 6 410 20:40 zhw3
[root@localhost home]# chmod 700 zhw3
[root@localhost home]# ll -d zhw3
drwx------. 2 zhw3 zhw3 6 410 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 一 410 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 一 410 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

账号管理案例

任务一

账号管理不是随意创建几个账号就好了,有时候我们需要考虑到一台主机上面可能有多个账号在协同工作。比如说,在某学校的实习生要分组,这些同一组的同学间必须要能够互相修改对方的数据文件,但是同时这些同学又需要保留自己的私密数据,因此直接公开家目录是不适宜的。那该如何是好呢?

任务一:单纯完成上面交代的任务,假设我们需要的账号数据如下,你该怎么做?

账号名称账号全名支持次要用户组是否可以登录主机密码
myuser1no.1 usermygroup1可以password
myuser2no.2 usermygroup2可以password
myuser3no.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 411 09:02 /srv/projecta/

本文参考《鸟哥的Linux私房菜》这本书


http://www.kler.cn/a/8015.html

相关文章:

  • 【linux】centos7 换阿里云源
  • 深度学习神经网络在机器人领域应用的深度剖析:原理、实践与前沿探索
  • 深度学习中的感受野:从基础概念到多层次特征提取
  • 1111111111待修改--大流量分析(三)-BUUCTF
  • 大模型时代,呼叫中心部门如何自建一套大模型在线客服?
  • ❤React-React 组件基础(类组件)
  • 【JavaWeb】8—过滤器
  • 【架构师从零进阶】Java基础 练气期 Day1
  • 旅游心得Traveling Experience
  • 从零开始:如何集成美颜SDK到你的应用中
  • Redis常用命令以及如何在Java中操作Redis
  • springcloud——并发请求处理方案
  • 软件测试面试复盘:技术面没有难倒我,hr面被虐的体无完肤
  • 笔记-常见的动态内存错误
  • 收割offer疯狂涨了5K,自动化测试面试题整理大全,你能答上多少?
  • js设计模式——组合模式
  • RBF-UKF径向基神经网络结合无迹卡尔曼滤波估计锂离子电池SOC(附MATLAB代码)
  • 在cmd命令窗口安装Python模块
  • 入门力扣自学笔记257 C++ (题目编号:1041)
  • GuLi商城-SpringCloud-Gateway网关核心概念、测试API网关
  • 探索三维世界:从Hello World开始的Three.js入门之旅
  • 硬件语言Verilog HDL牛客刷题day07 计数器与存储器部分
  • 亚马逊美国站严查磁体产品?亚马逊最新政策公布
  • 67页新型智慧城市整体规划建设方案
  • Thinkphp 6.0模版的循环标签
  • ToBeWritten之反入侵安全技术面经总结