# Linux 主机上的用户信息传递

如何针对系统上的用户进行查询?如果在 Linux 上操作时,有其他用户也登录主机,如何与它谈话?想知道某个账户的相关信息,如何查阅?

# 查询使用者:w、who、last、lastlog

之前提到过的 id、finger 等指令可以查询一个用户的相关信息。而 last 可以知道使用者合适登录的系统,前面第 10 章节 bash 中讲解过的

可以通过 w 或 who 来查询当前已登录系统的用户,也就是相当于在线用户列表

[root@study ~]# w
# 当前时间、开机(up)多久、几个用户在线
 22:20:50 up  1:37,  2 users,  load average: 0.18, 0.14, 0.17
# 一个表格说明,每一行表示一个使用者
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
mrcode   pts/0    192.168.0.105    21:11    2.00s  0.19s  3.27s sshd: mrcode [priv]
mrcode   pts/1    192.168.0.105    21:11    1:09m  8.52s  8.50s top

[root@study ~]# who
mrcode   pts/0        2020-02-25 21:11 (192.168.0.105)
mrcode   pts/1        2020-02-25 21:11 (192.168.0.105)
1
2
3
4
5
6
7
8
9
10
11

通过 lastlog 获得每个账户的最近登录时间,lastlog 会读取 /var/log/lastlog 文件

[root@study ~]# lastlog
# 用户名           端口     来自             最后登陆时间
Username         Port     From             Latest
root             pts/0                     二 225 21:23:43 +0800 2020
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**
lp                                         **从未登录过**
mrcode           pts/1    192.168.0.105    二 225 21:11:00 +0800 2020
mrcode1          pts/0                     二 225 22:05:37 +0800 2020

1
2
3
4
5
6
7
8
9
10
11

# 使用者谈话:write、mesg、wall

# write 对话

与系统上在线用户进行谈话,通过 write 将信息传给接收者

write 使用者账户 [用户所在终端接口]
1
[root@study ~]# who
mrcode   pts/0        2020-02-25 22:28 (192.168.0.105)
mrcode   pts/1        2020-02-25 22:28 (192.168.0.105)
root     pts/4        2020-02-25 22:28 (192.168.0.105)
root     pts/5        2020-02-25 22:28 (192.168.0.105)
# 笔者使用的是 ssh 软件链接的。类似 xshell 软件,所以可能显示的不是 tty 接口把
# 开启了两个链接,并且使用 su 切换的账户,是通过这个 who 看不出来的
# 只会显示最初登录系统的账户信息
# 笔者这里开启了两个窗口,一个登录 mrcode 账户,一个登录 root 账户

[root@study ~]# write mrcode pts/0
Hello,there:
Please dont't do anything wrong...
# 在 root 窗口上,对 mrcode pts/0 的终端接口写信息
# 上面两行是 root 传递的文字信息
# 要结束传递的话,需要通过组合键 ctrl + d 结束


# 在 mrcode 这边就会看到传递过来的信息了
[mrcode@study ~]$
Message from root@study.centos.mrcode on pts/2 at 22:33 ...
Hello,there:
Please dont't do anything wrong...
EOF

这两个交互式这样的,当 root 敲入 write mrcode pts/0 指令时,mrcode 这边就相当于进入了一个聊天窗口,输入一行按下回车键,信息就会显示到对方那边去。所以他们两个就可以谈话了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# mesg 启用或关闭对话功能

因为这种方式是及时聊天,如果 mrcode 此时正在查询资料,那么就会打断他原本的工作,如果 mrode 不想接受任何人的信息,可以下达该指令

[mrcode@study ~]$ mesg n	# 关闭信息
[mrcode@study ~]$ mesg
is n
1
2
3

不过该指令对 root 传来的信息是无效的,那么我们关闭 root 的,使用 mrcode 对 root 发送

# 当然要先打开 mesg 的功能,才能对别人发送信息
[mrcode@study ~]$ mesg y	# 打开
[mrcode@study ~]$ write root pts/2
write: root has messages disabled on pts/2
# 发现无法对 root 发送信息
1
2
3
4
5

# wall 广播信息

还可以通过 wall 对所有在线用户广播信息

[mrcode@study ~]$ wall "I will shutdown my linux server..."
[mrcode@study ~]$
Broadcast message from mrcode@study.centos.mrcode (pts/0) (Tue Feb 25 22:45:41 2020):

I will shutdown my linux server...

# 所有在线用户都能收到,包括 root,当然前提是对方 mesg y 打开时
1
2
3
4
5
6
7

# 使用者信箱:mail

wall、write 需要用户在线才能够使用交谈,可以使用 mail 寄信给用户,每个用户都具有一个 mailbox,可以寄、收 mailbox 内的信件。一般来说 mailbox 会放置在 /var/spool/mail 中,一个账号一个 mailbox 文件。比如 mrcode1 就具有 /var/spool/mail/mrcode1 这个 mailbox

# 寄信

mail -s "邮件标题" username@localhost
1
# root 用户给 mrcode 寄信
# 指令下达之后会进入写做模式,不过该模式下无法使用退格键,只能想好再写
[root@study ~]# mail -s "nice to meet you" mrcode
Hello,D.m tsai
Nice to meet you in the network.
You are so nice. bybye!
.					# 最后一行输入小数点,再次回车会完成寄信操作
EOT		
[root@study ~]#
1
2
3
4
5
6
7
8
9

会发现 mail 中的编辑器不好用,所以可以使用流来完成内容的导入

[root@study ~]# mail -s "nice to meet you" mrcode  < filename
# 先把信息写在文件中,然后使用 < 传输
1
2
# 范例 :将你的家目录下的环境变量文件 ~/.bashrc 寄给自己
mail -s "bashrc file content" mrcode < ~/.bashrc
# 范例 :通过管线命令将 `ls -al ~` 内容传给 root 自己
ls -al ~ | mail -s "myfile" root
1
2
3
4

# 收信

收信也是使用 mail 指令,如上面寄给了 mrcode

[mrcode@study ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/mrcode": 1 message 1 new
>N  1 root                  Tue Feb 25 22:52  19/700   "nice to meet you"
& 		# 这里可以输入很多指令,可以通过输入 ? 查询

# > :是表示目前处理的信件是哪一封
# N :表示该信件还未读过

# 尝试输入 ? 会出现以下的提示
& ?
               mail commands
type <message list>             type messages
next                            goto and type next message
from <message list>             give head lines of messages
headers                         print out active message headers
delete <message list>           delete messages
undelete <message list>         undelete messages
save <message list> folder      append messages to folder and mark as saved
copy <message list> folder      append messages to folder without marking them
write <message list> file       append message texts to file, save attachments
preserve <message list>         keep incoming messages in mailbox even if saved
Reply <message list>            reply to message senders
reply <message list>            reply to message senders and all recipients
mail addresses                  mail to specific recipients
file folder                     change to another folder
quit                            quit and apply changes to folder
xit                             quit and discard changes made to folder
!                               shell escape
cd <directory>                  chdir to directory or home if none given
list                            list names of all available commands

A <message list> consists of integers, ranges of same, or other criteria
separated by spaces.  If omitted, mail uses the last message typed.
&
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

上面信息中的 「message list」是表示每封邮件左边那个数据序号

指令 含义
h 列出信件比奥拓;如查询 40 封左右的信件,则输入 h 40
d 删除后续接的信件号码,删除单封是 d10,范围删除是 d10-20,该动作生效需要配合 q 指令
s 将信件存储成文件。比如将第 5 封的内容存储到文件 ~/mail.file 可以使用 s 5 ~/mail.file
x 只离开,不生效;或者输入 exit 也可以;比如刚刚用 h 删除了信件,使用 x 离开,就会撤销删除
q 生效并离开;尤其是删除

对于 h 操作来说,只有 5 封邮件的时候,使用 h 6 会报错,使用 h 2,同样会显示所有的,不知道是咋回事