第十四章、Linux 账号管理与 ACL 权限配置
最近升级日期:2009/09/09

大标题的图示Linux 主机上的用户信息传递

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


小标题的图示查询使用者: w, who, last, lastlog

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

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

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

[root@www ~]# w
 13:13:56 up 13:00,  1 user,  load average: 0.08, 0.02, 0.01
USER   TTY    FROM            LOGIN@   IDLE   JCPU   PCPU WHAT
root   pts/1  192.168.1.100   11:04    0.00s  0.36s  0.00s -bash
vbird1 pts/2  192.168.1.100   13:15    0.00s  0.06s  0.02s w
# 第一行显示目前的时间、启动 (up) 多久,几个用户在系统上平均负载等;
# 第二行只是各个项目的说明,
# 第三行以后,每行代表一个使用者。如上所示,root 登陆并取得终端机名 pts/1 之意。

[root@www ~]# who
root     pts/1        2009-03-04 11:04 (192.168.1.100)
vbird1   pts/2        2009-03-04 13:15 (192.168.1.100)

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

[root@www ~]# lastlog
Username    Port   From           Latest
root        pts/1  192.168.1.100  Wed Mar  4 11:04:22 +0800 2009
bin                                        **Never logged in**
....(中间省略)....
vbird1      pts/2  192.168.1.100  Wed Mar  4 13:15:56 +0800 2009
....(以下省略)....

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


小标题的图示使用者对谈: write, mesg, wall

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

[root@www ~]# write 使用者账号 [用户所在终端接口]

[root@www ~]# who
root     pts/1    2009-03-04 11:04 (192.168.1.100)
vbird1   pts/2    2009-03-04 13:15 (192.168.1.100)  <==有看到 vbird1 在在线

[root@www ~]# write vbird1 pts/2
Hello, there:
Please don't do anything wrong...  <==这两行是 root 写的信息!
# 结束时,请按下 [crtl]-d 来结束输入。此时在 vbird1 的画面中,会出现:

Message from root@www.vbird.tsai on pts/1 at 13:23 ...
Hello, there:
Please don't do anything wrong...
EOF

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

[vbird1@www ~]$ mesg n
[vbird1@www ~]$ mesg
is n

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

[vbird1@www ~]$ write root
write: root has messages disabled

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

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

然后你就会发现所有的人都会收到这个简讯呢!


小标题的图示使用者邮件信箱: mail

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

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

[root@www ~]# mail vbird1 -s "nice to meet you"
Hello, D.M. Tsai
Nice to meet you in the network.
You are so nice.  byebye!
.    <==这里很重要喔,结束时,最后一行输入小数点 . 即可!
Cc:  <==这里是所谓的『副本』,不需要寄给其他人,所以直接 [Enter]
[root@www ~]#  <==出现提示字符,表示输入完毕了!

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

例题:
请将你的家目录下的环境变量文件 (~/.bashrc) 寄给自己!
答:
mail -s "bashrc file content" vbird < ~/.bashrc

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

[vbird1@www ~]$ mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/vbird1": 1 message 1 new
>N  1 root@www.vbird.tsai   Wed Mar  4 13:36  18/663   "nice to meet you"
&  <==这里可以输入很多的命令,如果要查阅,输入 ? 即可!

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

& ?
    Mail   Commands
t <message list>                type messages
n                               goto and type next message
e <message list>                edit messages
f <message list>                give head lines of messages
d <message list>                delete messages
s <message list> file           append messages to file
u <message list>                undelete messages
R <message list>                reply to message senders
r <message list>                reply to message senders and all recipients
pre <message list>              make messages go back to /usr/spool/mail
m <user list>                   mail to specific users
q                               quit, saving unresolved messages in mbox
x                               quit, do not remove system mailbox
h                               print out active message headers
!                               shell escape
cd [directory]                  chdir to directory or home if none given

<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 则会进行两项动作: 1. 将刚刚删除的信件移出 mailbox 之外; 2. 将刚刚有阅读过的信件存入 ~/mbox ,且移出 mailbox 之外。鸟哥通常不很喜欢使用 q 离开, 因为,很容易忘记读过什么咚咚~导致信件给他移出 mailbox 说~

由于读过的信件若使用『 q 』来离开 mail 时,会将该信件移动到 ~/mbox 中,所以你可以这样想象: /var/spool/mail/vbird1 为 vbird1 的『新件匣』,而 /home/vbird1/mbox 则为『收件匣』的意思。 那如何读取 /home/vbird1/mbox 呢?就使用『mail -f /home/vbird1/mbox』即可。


 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室