13.6 Linux 主机上的使用者讯息传递

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

13.6.1 查询使用者: w, who, last, lastlog

如何查询一个使用者的相关数据呢?这还不简单,我们之前就提过了 id, finger 等指令了,都可以让您了解到一个使用者的相关信息啦!那么想要知道使用者到底啥时候登陆呢? 最简单可以使用 last 检查啊!这个玩意儿我们也在 第十章 bash 提过了, 您可以自行前往参考啊!简单的很。

鸟哥的图示

Tips 早期的 Red Hat 系统的版本中, last 仅会列出当月的登陆者信息,不过在我们的 CentOS 5.x 版以后, last 可以列出从系统创建之后到目前为止的所有登陆者信息!这是因为登录文件轮替的设置不同所致。 详细的说明可以参考后续的第十八章登录文件简介

那如果你想要知道目前已登陆在系统上面的使用者呢?可以通过 w 或 who 来查询喔!如下范例所示:

  1. [root@study ~]# w
  2. 01:49:18 up 25 days, 3:34, 3 users, load average: 0.00, 0.01, 0.05
  3. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  4. dmtsai tty2 07Jul15 12days 0.03s 0.03s -bash
  5. dmtsai pts/0 172.16.200.254 00:18 6.00s 0.31s 0.11s sshd: dmtsai [priv]
  6. # 第一行显示目前的时间、开机 (up) 多久,几个使用者在系统上平均负载等;
  7. # 第二行只是各个项目的说明,
  8. # 第三行以后,每行代表一个使用者。如上所示,dmtsai 登陆并取得终端机名 tty2 之意。
  9. [root@study ~]# who
  10. dmtsai tty2 2015-07-07 23:07
  11. dmtsai pts/0 2015-07-22 00:18 192.168.1.100

另外,如果您想要知道每个帐号的最近登陆的时间,则可以使用 lastlog 这个指令喔! lastlog 会去读取 /var/log/lastlog 文件,结果将数据输出如下表:

  1. [root@study ~]# lastlog
  2. Username Port From Latest
  3. root pts/0 Wed Jul 22 00:26:08 +0800 2015
  4. bin **Never logged in**
  5. ....(中间省略)....
  6. dmtsai pts/1 192.168.1.100 Wed Jul 22 01:08:07 +0800 2015
  7. vbird1 pts/0 Wed Jul 22 01:32:17 +0800 2015
  8. pro3 **Never logged in**
  9. ....(以下省略)....

这样就能够知道每个帐号的最近登陆的时间啰~ ^_^

13.6.2 使用者对谈: write, mesg, wall

那么我是否可以跟系统上面的使用者谈天说地呢?当然可以啦!利用 write 这个指令即可。 write 可以直接将讯息传给接收者啰!举例来说,我们的 Linux 目前有 vbird1 与 root 两个人在线上, 我的 root 要跟 vbird1 讲话,可以这样做:

  1. [root@study ~]# write 使用者帐号 [使用者所在终端接口]
  2. [root@study ~]# who
  3. vbird1 tty3 2015-07-22 01:55 <==有看到 vbird1 在线上
  4. root tty4 2015-07-22 01:56
  5. [root@study ~]# write vbird1 pts/2
  6. Hello, there:
  7. Please don't do anything wrong... <==这两行是 root 写的信息!
  8. # 结束时,请按下 [crtl]-d 来结束输入。此时在 vbird1 的画面中,会出现:
  9. Message from root@study.centos.vbird on tty4 at 01:57 ...
  10. Hello, there:
  11. Please don't do anything wrong...
  12. EOF

怪怪~立刻会有讯息回应给 vbird1 !不过……当时 vbird1 正在查数据,哇! 这些讯息会立刻打断 vbird1 原本的工作喔!所以,如果 vbird1 这个人不想要接受任何讯息,直接下达这个动作:

  1. [vbird1@study ~]$ mesg n
  2. [vbird1@study ~]$ mesg
  3. is n

不过,这个 mesg 的功能对 root 传送来的讯息没有抵挡的能力!所以如果是 root 传送讯息, vbird1 还是得要收下。 但是如果 root 的 mesg 是 n 的,那么 vbird1 写给 root 的信息会变这样:

  1. [vbird1@study ~]$ write root
  2. write: root has messages disabled

了解乎?如果想要解开的话,再次下达“ mesg y ”就好啦!想要知道目前的 mesg 状态,直接下达“ mesg ”即可!瞭呼? 相对于 write 是仅针对一个使用者来传“简讯”,我们还可以“对所有系统上面的使用者传送简讯 (广播)”哩~ 如何下达?用 wall 即可啊!他的语法也是很简单的喔!

  1. [root@study ~]# wall "I will shutdown my linux server..."

然后你就会发现所有的人都会收到这个简讯呢!连发送者自己也会收到耶!

13.6.3 使用者邮件信箱: mail

使用 wall, write 毕竟要等到使用者在线上才能够进行,有没有其他方式来联络啊? 不是说每个 Linux 主机上面的使用者都具有一个 mailbox 吗? 我们可否寄信给使用者啊!呵呵!当然可以啊!我们可以寄、收 mailbox 内的信件呢! 一般来说, mailbox 都会放置在 /var/spool/mail 里面,一个帐号一个 mailbox (文件)。 举例来说,我的 vbird1 就具有 /var/spool/mail/vbird1 这个 mailbox 喔!

那么我该如何寄出信件呢?就直接使用 mail 这个指令即可!这个指令的用法很简单的,直接这样下达:“ mail -s "邮件标题" username@localhost ”即可! 一般来说,如果是寄给本机上的使用者,基本上,连“ @localhost ”都不用写啦! 举例来说,我以 root 寄信给 vbird1 ,信件标题是“ nice to meet you ”,则:

  1. [root@study ~]# mail -s "nice to meet you" vbird1
  2. Hello, D.M. Tsai
  3. Nice to meet you in the network.
  4. You are so nice. byebye!
  5. . <==这里很重要喔,结束时,最后一行输入小数点 . 即可!
  6. EOT
  7. [root@study ~]# <==出现提示字符,表示输入完毕了!

如此一来,你就已经寄出一封信给 vbird1 这位使用者啰,而且,该信件标题为: nice to meet you,信件内容就如同上面提到的。不过,你或许会觉得 mail 这个程序不好用~ 因为在信件编写的过程中,如果写错字而按下 Enter 进入次行,前一行的数据很难删除ㄟ! 那怎么办?没关系啦!我们使用数据流重导向啊!呵呵!利用那个小于的符号 ( < ) 就可以达到取代键盘输入的要求了。也就是说,你可以先用 vi 将信件内容编好, 然后再以 mail -s "nice to meet you" vbird1 < filename 来将文件内容传输即可。

例题:请将你的主文件夹下的环境变量文件 (~/.bashrc) 寄给自己!答:mail -s "bashrc file content" dmtsai < ~/.bashrc例题:通过管线命令直接将 ls -al ~ 的内容传给 root 自己!答:ls -al ~ | mail -s "myfile" root

刚刚上面提到的是关于“寄信”的问题,那么如果是要收信呢?呵呵!同样的使用 mail 啊! 假设我以 vbird1 的身份登陆主机,然后输入 mail 后,会得到什么?

  1. [vbird1@study ~]$ mail
  2. Heirloom Mail version 12.5 7/5/10\. Type ? for help.
  3. "/var/spool/mail/vbird1": 1 message 1 new
  4. &gt;N 1 root Wed Jul 22 02:09 20/671 "nice to meet you"
  5. & &lt;==这里可以输入很多的指令,如果要查阅,输入 ? 即可!

在 mail 当中的提示字符是 & 符号喔,别搞错了~输入 mail 之后,我可以看到我有一封信件, 这封信件的前面那个 > 代表目前处理的信件,而在大于符号的右边那个 N 代表该封信件尚未读过, 如果我想要知道这个 mail 内部的指令有哪些,可以在 & 之后输入“ ? ”,就可以看到如下的画面:

  1. & ?
  2. mail commands
  3. type &lt;message list&gt; type messages
  4. next goto and type next message
  5. from &lt;message list&gt; give head lines of messages
  6. headers print out active message headers
  7. delete &lt;message list&gt; delete messages
  8. undelete &lt;message list&gt; undelete messages
  9. save &lt;message list&gt; folder append messages to folder and mark as saved
  10. copy &lt;message list&gt; folder append messages to folder without marking them
  11. write &lt;message list&gt; file append message texts to file, save attachments
  12. preserve &lt;message list&gt; keep incoming messages in mailbox even if saved
  13. Reply &lt;message list&gt; reply to message senders
  14. reply &lt;message list&gt; reply to message senders and all recipients
  15. mail addresses mail to specific recipients
  16. file folder change to another folder
  17. quit quit and apply changes to folder
  18. xit quit and discard changes made to folder
  19. ! shell escape
  20. cd &lt;directory&gt; chdir to directory or home if none given
  21. list list names of all available commands

<message list> 指的是每封邮件的左边那个数字啦!而几个比较常见的指令是:

指令 意义
h 列出信件标头;如果要查阅 40 封信件左右的信件标头,可以输入“ h 40 ”
d 删除后续接的信件号码,删除单封是“ d10 ”,删除 20~40 封则为“ d20-40 ”。 不过,这个动作要生效的话,必须要配合 q 这个指令才行(参考下面说明)!
s 将信件储存成文件。例如我要将第 5 封信件的内容存成 ~/mail.file:“s 5 ~/mail.file”
x 或者输入 exit 都可以。这个是“不作任何动作离开 mail 程序”的意思。 不论你刚刚删除了什么信件,或者读过什么,使用 exit 都会直接离开 mail,所以刚刚进行的删除与阅读工作都会无效。 如果您只是查阅一下邮件而已的话,一般来说,建议使用这个离开啦!除非你真的要删除某些信件。
q 相对于 exit 是不动作离开, q 则会实际进行你刚刚所执行的任何动作 (尤其是删除!)

旧版的 CentOS 在使用 mail 读信后,通过 q 离开始,会将已读信件移动到 ~/mbox 中,不过目前 CentOS 7 已经不这么做了! 所以离开 mail 可以轻松愉快的使用 q 了呢!

原文: https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/119.html