Linux系统用户与属组管理(3)

时间:2023-12-10 22:51:44

该系列文章只是本人的学习笔记,文章中的文字描述提取自《Linux鸟哥私房菜》《Linux运维之道》等书中的重点内容,化繁为简能够在工作中快速复习掌握重点,并不代表个人立场,但转载请加出处,并注明参考文献。

好了,终于要到了管理 Linux 账号的时刻了,对于 Linux 有一定的熟悉度之后,再来就是要管理连上 Linux 的账号问题了,这个账号的问题可大可小,大到可以限制他使用 Linux 主机的各项资源,小到甚至一般账号的密码订定守则都可以进行规定,管理员的工作中,相当重要的一环就是『管理账号』啦,因为整个系统都是你在管理的,并且所有一般用户的账号申请,都必须要透过你的协助才行,所以你就必须要了解一下如何管理好一个服务器主机的账号啦,在管理 Linux 主机的账号时,我们必须先来了解一下 Linux 到底是如何辨别每一个使用者的.

关于Linux UID账号 (User Identity 用户标识号)

超级用户: UID=0

系统用户: UID=500-65535 最大:1000-65535

普通用户: UID:500-65535 最大:1000-65535

关于Linux GID账号 (Group Identify 组标识号)

初始组(私有组),附加组(公共组)

Linux 用户文件解析

虽然我们登陆 Linux 主机的时候,输入的是我们的账号,但是其实 Linux 主机并不会直接认识你的『账号名称』的,他仅认识 ID (ID 就是一组号码),由于计算机仅认识 0 与 1,所以主机对于数字比较有概念的,至于账号只是为了让人们容易记忆而已,而你的 ID 与账号的对应就在 /etc/passwd 当中,为了安全起见 Linux 把用户密码单独放在了 /etc/shadow 目录下,且权限是只允许root能够访问,下面我们来介绍一下其这两个配置文件的具体参数吧.

◆/etc/passwd◆

这个文件的构造是这样的,每一行都代表一个账号,有几行就代表有几个账号在你的系统中,不过需要特别留意的是,里头很多账号本来就是系统正常运行所必须要的,我们可以简称他为系统账号,例如 bin,daemon,adm,nobody 等,这些账号请不要随意的删除,这个文件的内容有点像下面这个样子.

[root@localhost ~]# head -n 3 /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
....省略....

我们先来看一下每个Linux系统都会有的第一行,就是root这个系统管理员那一行好了,你可以明显的看出来,每一行使用『:』分隔开,共有七个咚咚,分别是:

列号码 本列作用
第一列 用户名:就是账号,用来对应UID的:例如root的UID对应就是0
第二列 密码位:密码占位符,这个字段的密码数据在/etc/shadow中
第三列 用户UID:0=管理员,1-499=系统账户,500-65535=自定义账户
第四列 用户GID:也就是用户的组ID号,这个GID与/etc/group有关
第五列 用户描述信息:这一列可有可无,只是用来解释账号的意义而已
第六列 用户家目录:指定了用户的家目录保存位置,系统默认生成
第七列 登陆默认Shell:指明系统默认的登陆shell是什么

◆/etc/shadow◆

我们知道很多程序的运行都与权限有关,而权限与 UID/GID 有关,因此各程序当然需要读取 /etc/passwd 来了解不同账号的权限,因此 /etc/passwd 的权限需配置为 -rw-r--r-- 这样的情况,虽然早期的口令也有加密过,但却放置到 /etc/passwd 的第二个字段上,这样一来很容易被有心人士所窃取的,加密过的口令也能够透过暴力破解法去 try and error (试误) 找出来.

因为这样的关系,所以后来发展出将口令移动到 /etc/shadow 这个文件分隔开来的技术,而且还加入很多的口令限制参数在 /etc/shadow 里头,在这里,我们先来了解一下这个文件的构造吧,这个 /etc/shadow 文件有点像下面这样:

[root@localhost ~]# head -n 3 /etc/shadow
root:$6$TT4VWP5W$Libo7Yk8JzG15VQWKu:17699:0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
....省略....

基本上,shadow 同样以『:』作为分隔符,如果数一数,会发现共有九个字段,这九个字段的用途是这样的:

列号码 本列作用
第一列 用户名:这个文件的第一栏就是账号,必须要与/etc/passwd相同才行
第二列 密码位:这个字段内的数据才是真正的口令,而且是经过加密的口令
第三列 密码最近更改时间:这个字段记录了『更改系统口令那一天』的日期
第四列 密码最短有效期:账号的口令在最近一次被更改后需要经过几天后才能再次更改
第五列 密码最长有效期:指定在最近一次更改口令后,经过多久需要再次更改的时间
第六列 密码到期前的警告天数:当账号口令过期时,系统会发出『警告』给这个账号
第七列 密码过期后的宽限天数:口令有效日期为『升级日期(第3字段)』+『重新变更日期(第5字段)』
第八列 密码失效时间:账号在此字段规定的日期之后,将无法再使用,默认是9999999
第九列 系统保留:此配置没有被使用,属于系统保留字段

## Linux 属组文件解析

认识了账号相关的两个文件 /etc/passwd 与 /etc/shadow 之后,你或许还是会觉得奇怪,那么群组的配置文件在哪里?还有在 /etc/passwd 的第四栏不是所谓的 GID 吗? 那又是啥? 此时就需要了解 /etc/group 与 /etc/gshadow 这两个配置文件喽.

◆/etc/group◆

这个文件就是在记录 GID 与组名的对应了,他主要是实现组用户的记录工作, /etc/group 内容有点像以下这样:

[root@localhost ~]# head -n 3 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
....省略....

这个文件每一行代表一个群组,也是以冒号『:』作为字段的分隔符,共分为四栏,每一字段的意义如下:

列号码 本列作用
第一列 组名称:就是组名,在新建用户的时候系统会为用户分配一个默认组.
第二列 密码占位符:通常不需要配置,这个配置通常是给『组管理员』使用的.
第三列 组ID号(GID):就是群组的 ID 号码.
第四列 成员列表:显示本组内的成员列表

◆/etc/gshadow◆

本配置文件用于存储组的密码,等相关信息/etc/gshadow的内容有点像这样:

[root@localhost ~]# head -n 3 /etc/gshadow
root:::
bin:::
daemon:::
....省略....

这个文件内同样还是使用冒号『:』来作为字段的分隔字符,而且你会发现,这个文件几乎与/etc/group一模一样,是这样没错不过,要注意的大概就是第二个字段,第二个字段是口令栏,如果口令栏上面是『!』时,表示该群组不具有群组管理员,至于第四个字段也就是支持的账号名称,这四个字段的意义为:

列号码 本列作用
第一列 用户组:就是组名,本配置文件必须与/etc/group文件相对应.
第二列 组密码:这个段可以是空的或!,如果是空的或有!,表示没有密码
第三列 组管理者:这个字段也可为空,如果有多个用户组管理者用,分割
第四列 组内成员:如果有多个成员用,号分割

以系统管理员的角度来说,这个 gshadow 最大的功能就是创建群组管理员啦,那么什么是群组管理员呢?由于系统上面的账号可能会很多,但是我们root可能平时太忙碌,所以当有使用者想要加入某些群组时,root或许会没有空管理,此时如果能够创建群组管理员的话,那么该群组管理员就能够将那个账号加入自己管理的群组中,可以免去root的忙碌啦.

Linux 用户管理命令

好啦!既然要管理账号,当然是由新增与移除使用者开始的啰~底下我们就分别来谈一谈如何新增、移除与更改用户的相关信息吧~

◆useradd 新建用户◆

useradd命令用于Linux中创建的新的系统用户,useradd可用来建立用户帐号,帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号,使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中,在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的useradd命令建立新用户,如此可方便管理员建立用户帐号.在Red Hat Linux中,adduser命令则是useradd命令的符号连接,两者实际上是同一个指令,其参数我们会在下面进行说明.

[root@localhost ~]# useradd --help

命令语法:[ user [选项] 用户名 ]

        -u UID          #创建用户时指定UID号
-g 组名 #指定一个初始组
-G 组名 #加入一个附加组
-d 目录 #手动指定某目录为家目录
-s 类型 #指定默认Shell,默认/bin/bash
-M #强制不创建家目录
-D #查询默认配置参数
-m #强制创建家目录
-c #指定说明信息,可随便写
-r #创建一个系统的账号
-e #指定账号失效日期,格式为『YYYY-MM-DD』
-f #指定口令是否会失效,0为立刻失效
-1 #指定用户永远不失效

实例1:使用 useradd -M -r -s /sbin/nologin 参数创建一个系统用户.

[root@localhost ~]# useradd -M -r -s /sbin/nologin lyshark

[root@localhost ~]# cat /etc/passwd |grep lyshark
lyshark:x:997:995::/home/lyshark:/sbin/nologin

实例2:使用 useradd -G 参数创建用户并指定组.

[root@localhost ~]# groupadd admin
[root@localhost ~]# useradd -G admin wang [root@localhost ~]# cat /etc/group |grep wang
admin:x:1000:wang

关于useradd命令的拓展

其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单的使用『 useradd 账号 』来创建使用者即可,这些默认值主要会帮我们处理几个项目:

在 /etc/passwd 里面创建一行与账号相关的数据,包括创建UID/GID/家目录等.

在 /etc/shadow 里面将此账号的口令相关参数填入,但是尚未有口令.

在 /etc/group 里面加入一个与账号名称一模一样的组名.

在 /home 底下创建一个与账号同名的目录作为用户家目录,且权限为700.

那么我们在创建默认用户的时候也会参考一些配置文件,来完成默认参数的配置,现在我们可以使用下面的命令来直接获取默认配置参数.

[root@localhost ~]# useradd -D

GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

这个数据其实是由/etc/default/useradd参数读取出来的,你可以自行用VIM去观察该文件的内容,搭配上头刚刚谈过的运行结果,上面这些配置项目所造成的行为分别是:

[root@localhost ~]# vim /etc/default/useradd

GROUP=100

#新创建用户时默认初始组的GID号(公有组机制)
#现在使用的是私有组机制(根据创建用户名称创建组) HOME=/home
#新创建用户的家目录的默认位置 INACTIVE=-1
#密码过期后宽限天数(过期停权),用天数表示:0代表密码到期立刻失效;正数代表密码到期后的宽限天数;-1 表示密码永不失效。 EXPIRE=
#密码失效时间,此处写时间戳,到达时间戳时间后立刻失效,不填写表示用户密码永不过期。 SHELL=/bin/bash
#此选项是创建用户时默认的shell类型,/bin/bash 表示可以登录系统 SKEL=/etc/skel
#此选项是创建用户时使用的模板目录,/etc/skel中的文件在用户创建时都会被复制到用户家目录下。 GREATE_MAIL_SPOOL=yes
#此选项是是否给新用户创建邮件缓冲(即新邮箱)
[root@localhost ~]# vim /etc/login.defs

MAIL_DIR /var/spool/mail
#指定新用户的默认邮箱位置。比如xdl用户的邮箱目录位置:/var/spool/mail/lyshark PASS_MAX_DAYS 99999
#这行指定的是密码的有效期,也就是/etc/shadow文件的第五字段。代表多少天之后必须修改密码,默认值是99999 PASS_MIN_DAYS 0
#这行指定的是两次密码的修改间隔时间,也就是/etc/shadow文件的第四字段。代表第一次修改密码之后,几天后才能再次修改密码。默认值是0 PASS_MIN_LEN 5
#这行代表密码的最小长度,默认不小于5位。但是我们现在用户登录时验证已经被PAM模块取代,所以这个选项并不生效 PASS_WARN_AGE 7
#这行代表密码修改到期前的警告天数,也就是/etc/shadow文件的第六字段。代表密码到底有效期前多少天开始进行警告提醒,默认值是7天 UID_MIN 500
#创建普通用户的时候默认的起始UID号 UID_MAX 60000
#创建普通用户,不用-u 指定时,默认最大的UID号。
#注:假如有一个用户创建时通过 -u 指定了 UID 为 550,那么下一次不指定-u 时,则起始UID 变成从551开始,500-549之间的那些会跳过不使用。 GID_MIN 500
#创建组的时候默认的起始GID号 GID_MAX 60000
#创建组的时候默认的最大的GID号 CREATE_HOME yes
#创建用户时是否创建用户家目录默认 yes 创建 UMASK 077
#这行指定的是建立的用户家目录的默认权限,因为umask值是077,所以新建的用户家目录的权限是700 USERGROUPS_ENAB yes
#这行指定的是使用命令userdel删除用户时,是否删除用户的初始组,默认是删除 ENCRYPT_METHOD SHA512
#这行指定Linux用户的密码使用SHA512散列模式加密,这是新的密码加密模式,原先的Linux只能用DES或MD5方式加密

现在你知道啦,使用 useradd 这支程序在创建 Linux 上的账号时,至少会参考:

/etc/default/useradd

/etc/login.defs

/etc/skel/*

这些文件,不过最重要的其实是创建 /etc/passwd,/etc/shadow,/etc/group,/etc/gshadow还有用户家目录就是了~所以,如果你了解整个系统运行的状态,也是可以手动直接修改这几个文件就是了.

◆passwd 设置密码◆

passwd命令用于设置用户的认证信息,包括用户密码、密码过期时间等,系统管理者则能用它管理系统用户的密码,只有管理者可以指定用户名称,一般用户只能变更自己的密码,其参数我们会在下面进行说明.

[root@localhost ~]# passwd --help

命令语法:[ passwd [选项] 用户名 ]

        -u UID          #创建用户时指定UID号
--stdin #非交互给予密码
-l 用户名 #锁定用户,使之无法登陆,会将 /etc/shadow 第二栏最前面加上 ! 使口令失效.
-u 用户名 #解锁用户,是 Unlock 的意思
-S 用户名 #查看用户账号状态(是否被锁定).
-n #后面接天数,多久不可修改口令天数
-x #后面接天数,多久内必须要更动口令
-w #后面接天数,口令过期前的警告天数
-i #后面接『日期』,口令失效日期

实例1:使用 echo |passwd --stdin 参数非交互设置密码.

[root@localhost ~]# echo "lyshark" |passwd --stdin lyshark

Changing password for user lyshark.
passwd: all authentication tokens updated successfully.

实例2:使用 passwd 参数修改lyshark用户的密码.

[root@localhost ~]# passwd lyshark

Changing password for user lyshark.
New password: 123123
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 123123
passwd: all authentication tokens updated successfully.

root果然是最伟大的人物,当我们要给予用户口令时,通过root来配置即可,root可以配置各式各样的口令,系统几乎一定会接受,所以如同上面的范例,明明输入的口令太短了,但是系统依旧可接受123123这样的口令配置.

◆usermod 管理用户◆

usermod命令用于修改用户的基本信息,usermod命令不允许你改变正在线上的使用者帐号名称,当usermod命令用来改变userid,必须确认这名user没在电脑上执行任何程序,你需手动更改使用者的crontab,也需手动更改使用者的at工作,采用NIS server须在server上更动相关的NIS设定,其参数我们会在下面进行说明.

[root@localhost ~]# usermod --help

命令语法:[ usermod [选项] 用户名 ]

        -u UID          #创建用户时指定UID号
-c #后面加账号说明
-d 目录 #结合 -m 直接对家目录进行改名
-e #后面接日期,格式是 YYYY-MM-DD
-f #后面接天数
-g 组名 #修改指定初始组
-G #修改指定附加组
-a #与 -G 合用,添加次要组
-l 新名 旧名 #修改用户名
-s shell #修改默认Shell
-u UID #修改用户的指定UID
-L #冻结指定用户,让其无法登陆
-U #解除冻结

如果你仔细的比对,会发现 usermod 的选项与 useradd 非常类似,这是因为 usermod 也是用来微调 useradd 添加的使用者参数嘛,不过 usermod 还是有新增的选项,那就是 -L 与 -U,不过这两个选项其实与 passwd 的 -l,-u 是相同的.

实例1:使用 usermod -m -d /home/hello wang 参数将原wang家目录修改成hello.

[root@localhost home]# ls
wang
[root@localhost home]# usermod -m -d /home/hello wang [root@localhost home]# ls
hello

实例2:使用 usermod -s /bin/bash 参数修改lyshark账户的默认shell.

[root@localhost ~]# usermod -s /bin/bash lyshark

◆userdel 删除用户◆

userdel命令用于删除给定的用户,以及与用户相关的文件,若不加选项,则仅删除用户帐号,而不删除相关文件,其参数我们会在下面进行说明.

[root@localhost ~]# userdel --help

命令语法:[ userdel [选项] 用户名 ]

        -f              #强制删除用户,即使用户已登陆
-r #同时删除家目录

这个功能就太简单了,目的在删除用户的相关数据,而用户的数据有:

用户账号/口令相关参数:/etc/passwd, /etc/shadow

使用者群组相关参数:/etc/group, /etc/gshadow

用户个人文件数据: /home/username, /var/spool/mail/username..

这个命令下达的时候要小心了,通常我们要移除一个账号的时候,你可以手动的将 /etc/passwd 与 /etc/shadow 里头的该账号取消即可,一般而言,如果该账号只是『暂时不激活』的话,那么将 /etc/shadow 里头账号失效日期 (第八字段) 配置为 0 就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来,使用userdel的时候通常是『你真的确定不要让该用户在主机上面使用任何数据了』

◆chage 查询参数◆

chage命令是用来修改帐号和密码的有效期限,其参数我们会在下面进行说明.

[root@localhost ~]# chage --help

命令语法:[ chage [选项] 用户名 ]

        -m              #密码可更改的最小天数
-M #密码保持有效的最大天数
-w #用户密码到期前警告天数
-E #帐号到期时间
-d #上一次更改的日期
-l #列出该账号的详细口令参数
chage -d 0 #强制用户下次登陆修改密码

实例1:使用 chage -d 0 lyshark 强制用户下次登陆修改密码.

[root@localhost ~]# chage -l lyshark
Last password change : Nov 14, 2018
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 [root@localhost ~]# chage -d 0 lyshark [root@localhost ~]# chage -l lyshark
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
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

## Linux 属组管理命令

了解了账号的新增、删除、更动与查询后,再来我们可以聊一聊群组的相关内容了,基本上,群组的内容都与这两个文件有关:/etc/group,/etc/gshadow,群组的内容其实很简单,都是上面两个文件的新增、修改与移除而已,不过如果再加上有效群组的概念,那么gpasswd则不可不知呢.

◆groupadd 添加属组◆

groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中,其参数我们会在下面进行说明.

[root@localhost ~]# groupadd --help

命令语法:[ groupadd [选项] 组名 ]

        -g              #指定组GID
-r #创建系统群组

◆groupmod 修改属组◆

groupmod命令更改群组识别码或名称,需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作,其参数我们会在下面进行说明.

[root@localhost ~]# groupmod --help

命令语法:[ groupmod [选项] 组名 ]

        -g              #修改原有的GID数字
-n #修改原有的组名

◆groupdel 删除属组◆

groupdel命令用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow,若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组,其参数我们会在下面进行说明.

[root@localhost ~]# groupdel --help

命令语法:[ groupdel [选项] 组名 ]

◆gpasswd 添加成员◆

gpasswd命令是Linux下工作组文件/etc/group和/etc/gshadow管理工具,其参数我们会在下面进行说明.

[root@localhost ~]# gpasswd --help

命令语法:[ gpasswd [选项] 组名 ]

        -a              #添加用户到组
-d #从组删除用户
-A #指定管理员
-M #指定组成员
-r #删除密码
-R #限制用户登入组

实例1:使用 gpasswd -a 添加lyshark用户到root组.

[root@localhost ~]# gpasswd -a lyshark root

Adding user lyshark to group root

实例2:使用 gpasswd -d 从lyshark组中删除root.

[root@localhost ~]# gpasswd -d lyshark root

Removing user lyshark from group root

实例3:使用 gpasswd -M 批量将用户 a1,a2,a3,a4 添加到test组.

[root@localhost ~]# useradd a1
[root@localhost ~]# useradd a2
[root@localhost ~]# useradd a3
[root@localhost ~]# useradd a4
[root@localhost ~]# groupadd test [root@localhost ~]# gpasswd -M a1,a2,a3,a4 test root@localhost ~]# cat /etc/group |grep test
test:x:1008:a1,a2,a3,a4

## Linux 用户查询命令

谈了这么多的账号问题,总是该要谈一谈,那么如何针对系统上面的用户进行查询吧?想几个状态,如果你在Linux上面操作时,刚好有其他的用户也登陆主机,你想要跟他对谈,该如何是好,你想要知道某个账号的相关信息,该如何查阅,下面我们就来看一看具体的查询技巧吧.

◆su 切换身份命令◆

su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码,其参数我们会在下面进行说明.

[root@localhost ~]# su --help

命令语法:[ su - [选项] 用户名 ]

        -c 指令          #执行完指定的指令后,即恢复原来的身份
-f #使shell不用去读取启动文件
-l #改变身份时连同环境变量一起切换
-m #改变身份不同步环境变量
-s shell #指定要执行的shell

实例1:使用 su -c 执行指令后自动退出.

[root@localhost ~]# su -c id lyshark

uid=1000(lyshark) gid=1000(lyshark) groups=1000(lyshark)

◆id 查询用户信息◆

id命令可以显示真实有效的用户ID(UID)和组ID(GID),UID 是对一个用户的单一身份标识,组ID(GID)则对应多个UID,id命令已经默认预装在大多数Linux系统中,要使用它,只需要在你的控制台输入id,其参数我们会在下面进行说明.

[root@localhost ~]# id --help

命令语法:[ id [选项] 用户名 ]

        -g              #显示用户所属群组的ID
-G #显示用户所属附加群组的ID
-n #显示用户,所属群组或附加群组的名称.
-r #显示实际ID
-u #显示用户ID

实例1:使用 id 命令查询指定用户.

[root@localhost ~]# id lyshark

uid=1000(lyshark) gid=1000(lyshark) groups=1000(lyshark)

◆w 显示登陆用户列表◆

w命令用于显示已经登陆系统的用户列表,并显示用户正在执行的指令,执行这个命令可得知目前登入系统的用户有那些人,以及他们正在执行的程序,单独执行w命令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息,其参数我们会在下面进行说明.

[root@localhost ~]# w --help

命令语法:[ w [选项] 用户名 ]

        -h              #不打印头信息
-u #当显示当前进程和cpu时间时忽略用户名
-s #使用短输出格式
-f #显示用户从哪登录

实例1:使用 w 命令查看系统正在登陆的用户.

[root@localhost ~]# w

 14:40:07 up 3 min,  2 users,  load average: 0.03, 0.09, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.1.20 14:37 7.00s 0.10s 0.00s w
lyshark pts/1 192.168.1.20 14:38 1:59 0.01s 0.01s -bash

实例2:使用 w -h lyshark 命令查看lyshark用户的登陆情况.

[root@localhost ~]# w -h lyshark
lyshark pts/1 192.168.1.20 14:38 4:31 0.01s 0.01s -bash

◆who 显示登录系统信息◆

who命令是显示目前登录系统的用户信息,执行who命令可得知目前有那些用户登入系统,单独执行who命令会列出登入帐号,使用的终端机,登入时间以及从何处登入或正在使用哪个显示器,其参数我们会在下面进行说明.

[root@localhost ~]# who --help

命令语法:[ who [选项] ]

        -H              #显示各栏位的标题信息列
-u #显示用户闲置时间(1分钟内无操作显示. 24小时不操作显示old)
-m #与 who am i 参数效果相同
-q #只显示登入系统的帐号名称和总人数
-s #只负责解决兼容性问题
-w #显示用户的信息状态栏

实例1:使用 who -q 命令查看系统登录用户总人数.

[root@localhost ~]# who -q

root lyshark admin users wangrui
# users=5

◆last 显示用户最近登录信息◆

last命令用于显示用户最近登录信息,单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来,其参数我们会在下面进行说明.

[root@localhost ~]# last --help

命令语法:[ last [选项] [文件目录] ]

        -H              #显示各栏位的标题信息列
-a #把从何处登入系统的主机名称或IP,显示在最后一行
-d #将IP地址转换成主机名称
-f 记录文件 #指定记录文件
-n 显示条数 #设置列出名单的显示列数
-R #不显示登入系统的主机名称或IP地址
-x #显示系统关机,重新开机,以及执行等级的改变等信息

实例1:使用 last -f /var/log/wtmp 指定一个读取文件,来打印.

[root@localhost ~]# last -f /var/log/wtmp

lyshark  pts/1        192.168.1.20     Wed Nov 14 14:38   still logged in
root pts/0 192.168.1.20 Wed Nov 14 14:37 still logged in
reboot system boot 3.10.0-862.el7.x Wed Nov 14 14:36 - 14:57 (00:21)
root pts/0 192.168.1.8 Tue Nov 6 11:02 - crash (8+03:34)
....省略....
wtmp begins Sat Oct 13 12:39:18 2018

实例2:使用 last -n 4 命令显示前4行数据.

[root@localhost ~]# last -n 4
lyshark pts/1 192.168.1.20 Wed Nov 14 14:38 still logged in
root pts/0 192.168.1.20 Wed Nov 14 14:37 still logged in
reboot system boot 3.10.0-862.el7.x Wed Nov 14 14:36 - 14:58 (00:22)
root pts/0 192.168.1.8 Tue Nov 6 11:02 - crash (8+03:34) wtmp begins Sat Oct 13 12:39:18 2018

◆lastlog 显示最后登陆信息◆

lastlog命令用于显示系统中所有用户最近一次登录信息.

lastlog文件在每次有用户登录时被查询,可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容,它根据UID排序显示登录名、端口号(tty)和上次登录时间,如果一个用户从未登录过,lastlog显示 Never logged,注意需要以root身份运行该命令,其参数我们会在下面进行说明.

[root@localhost ~]# lastlog --help

命令语法:[ lastlog [选项] [文件目录] ]

        -b 天数         #显示指定天数前的登录信息
-t 天数 #显示指定天数以来的登录信息
-u 用户名 #显示指定用户的最近登录信息

实例1:使用 lastlog -u root 查询root的最后登录日期.

[root@localhost ~]# lastlog -u root

Username         Port     From             Latest
root pts/0 192.168.1.20 Wed Nov 14 14:37:27 -0500 2018

## Linux 用户对话命令

◆write 在线发送提示◆

write命令用于向指定登录用户终端上发送信息,通过write命令可传递信息给另一位登入系统的用户,当输入完毕后,键入EOF表示信息结束,write命令就会将信息传给对方,如果接收信息的用户不只登入本地主机一次,你可以指定接收信息的终端机编号.

实例1:使用 write 给lyshark用户发送消息.

[root@localhost ~]# echo "hello lyshark" | write lyshark

实例2:使用 write 给lyshark用户无线发送乱码.

while true
do
cat /var/log/messages |base64 |write lyshark
done

注意:若对方设定mesg n 则此时信息将无法传给对方.

◆wall 给所有人通知◆

wall命令用于向系统当前所有打开的终端上输出信息,通过wall命令可将信息发送给每位同意接收公众信息的终端机用户,若不给予其信息内容,则wall命令会从标准输入设备读取数据,然后再把所得到的数据传送给所有终端机用户.

实例1:使用 wall 给全部用户发送消息.

[root@localhost ~]# wall hello linux admin
[root@localhost ~]# Broadcast message from root@localhost.localdomain (pts/0) (Wed Nov 14 15:28:01 2018): hello linux admin

◆mail 发送邮件◆

mail命令是命令行的电子邮件发送和接收工具,操作的界面不像elm或pine那么容易使用,但功能非常完整,其参数我们会在下面进行说明.

[root@localhost ~]# yum install -y mailx
[root@localhost ~]# mail --help 命令语法:[ mail [选项] [用户] ] -b 地址 #指定密件副本的收信人地址
-c 地址 #指定副本的收信人地址
-f 邮件文件 #读取指定邮件文件中的邮件
-i #不显示终端发出的信息
-I #使用互动模式
-s 邮件主题 #指定邮件的主题
-u 用户帐号 #读取指定用户的邮件 h #列出信件表头
d #删除邮件
s #将邮件保存成文件
q #退出

实例1:使用 mail 使用管道进行邮件发送.

[root@localhost ~]# echo "hello,this is the content of mail." |mail -s "by root" lyshark

You have new mail in /var/spool/mail/root

实例2:使用 mail 使用文件进行邮件发送.

[root@localhost ~]# mail -s "by root" admin@mkdirs.com < mail.txt

You have new mail in /var/spool/mail/root

参考文献:Linux鸟哥私房菜,Linux运维之道