# 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
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 二 2月 25 21:23:43 +0800 2020
bin **从未登录过**
daemon **从未登录过**
adm **从未登录过**
lp **从未登录过**
mrcode pts/1 192.168.0.105 二 2月 25 21:11:00 +0800 2020
mrcode1 pts/0 二 2月 25 22:05:37 +0800 2020
1
2
3
4
5
6
7
8
9
10
11
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
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
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
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
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
2
3
4
5
6
7
8
9
会发现 mail 中的编辑器不好用,所以可以使用流来完成内容的导入
[root@study ~]# mail -s "nice to meet you" mrcode < filename
# 先把信息写在文件中,然后使用 < 传输
1
2
2
# 范例 :将你的家目录下的环境变量文件 ~/.bashrc 寄给自己
mail -s "bashrc file content" mrcode < ~/.bashrc
# 范例 :通过管线命令将 `ls -al ~` 内容传给 root 自己
ls -al ~ | mail -s "myfile" root
1
2
3
4
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
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,同样会显示所有的,不知道是咋回事