最近老板沉迷于抖音,时不时在那边呵呵傻笑,因而我偷偷凑过去一看,好家伙,他正在看朱一旦~linux
这天,老板幽幽地走到我身边,淡淡地跟我说,良许,你要是能找到公司里混水摸鱼的人,我就给你涨薪!我回过头,望着他朱一旦似的枯燥笑脸,自信说道,放心,有我在,公司里就没有摸鱼的人!程序员
做为一名资深摸鱼专家,熟知 108 种摸鱼手段,精通 18 般躲避领导突击检查方法,因此,谁想摸鱼都逃不出个人火眼精睛。面试
做为一名 Linux 程序员,天天都要跟服务器打交道,那么想要找到谁在摸鱼,只要关注他的两个指标就行:shell
Linux 系统给咱们提供了大量很是实用的命令,固然有一些命令能够用来查看系统各用户在系统上登陆的次数,以及使用系统总时间。用户的这些信息是保存在 /var/log/wtmp
文件里,因此咱们就能够经过一些简单的命令把咱们想要的信息提取出来。vim
这些信息就是摸鱼的证据!bash
一个能够实现这个目的的命令就是 last
命令。这个命令能够列出用户登陆的详细信息,可供咱们进行追溯。它的典型输出以下:服务器
$ last | head -5 | tr -s " " liangxu pts/0 192.168.0.14 Wed Jan 14 09:44 still logged in liangxu pts/0 192.168.0.14 Wed Jan 14 09:41 - 09:41 (00:00) liangxu pts/0 192.168.0.14 Wed Jan 14 09:40 - 09:41 (00:00) alex pts/1 192.168.0.18 Wed Jan 14 09:38 still logged in liangxu pts/0 192.168.0.14 Tue Jan 13 06:15 - 18:18 (00:24)
在上面这行命令中,tr -s " "
表示将多个空格合并为一个,这样能够节约篇幅。若是没有加上 tr
命令的话,它的输出会相似下面这样:.net
$ last | head -5 liangxu pts/0 192.168.0.14 Wed Jan 14 09:44 still logged in liangxu pts/0 192.168.0.14 Wed Jan 14 09:41 - 09:41 (00:00) liangxu pts/0 192.168.0.14 Wed Jan 14 09:40 - 09:41 (00:00) alex pts/1 192.168.0.18 Wed Jan 14 09:38 still logged in liangxu pts/0 192.168.0.14 Wed Jan 14 09:15 - 09:40 (00:24)
像上面那样 last
命令没有跟任何参数的话,它会列出全部用户的登陆信息。若是你只想看某个用户登陆状况,那么只需在 last 后面跟上具体的用户名便可,即:命令行
$ last username
这里还加了 head -5
命令,它的做用是只列出 last 命令结果的前 5 条信息。若是不加这个命令的话,那么出来的结果将很长,咱们能够用 wc
命令稍微瞧一眼:code
$ last | wc -l
因此,经过 last 命令能够看到每一个人的登陆状况,摸鱼的小伙伴们,请接招!
在 last 命令的结果里,用户每登陆一次,就会产生一条记录,因此这里咱们就能够使用这些记录来统计每一个用户登陆的次数。
$ for user in `ls /home`; do echo -ne "$user\t"; last $user | wc -l; done dorothy 21 dory 13 eel 29 jadep 124 jdoe 27 jimp 42 alex 9 shark 17 liangxu 423 test 2 waynek 201
在上面的命令里,咱们先获取 home 目录下全部用户,而后依次使用 last 命令获取他们的登陆状况,再使用 wc 命令统计他们的登陆次数。
固然,为了查看你们的登陆次数,每次都要敲这么长的一条命令,那真的很让人抓狂。因此一个比较好的办法就是将这条命令直接写成 shell 脚本,下次咱们想用的时候就能够直接运行它了。
咱们能够新建一个 show_user_logins.sh
脚本,而后使用 vim 写入如下内容:
#!/bin/bash echo -n "Logins since " who /var/log/wtmp | head -1 | awk '{print $3}' echo "=======================" for user in `ls /home` do echo -ne "$user\t" last $user | wc -l done
写完以后按 :wq
保存退出。再以后使用命令 chmod +x show_user_logins.sh
使这个脚本具备可执行属性。
一切准备就绪后咱们就能够运行这个脚本,能够看到获得的结果跟咱们在命令行里手动敲的命令结果一致。
$ ./show_user_logins Logins since 2019-12-05 ======================= dorothy 21 dory 13 eel 29 jadep 124 jdoe 27 jimp 42 alex 9 shark 17 liangxu 423 test 2 waynek 201
经过第一招,摸鱼的小伙伴已经浮出水面,并受到重重一击:
但做为资深摸鱼专家,我确定知道,用户每登陆一次就会有一次记录,那么多登几回就会显得本身很勤快,因此使用这种方法很容易躲避追击。
不急,我还有第二招,想在我眼皮底下摸鱼没那么容易!
2020 精选 阿里/腾讯等一线大厂 面试、简历、进阶、电子书 公众号「良许Linux」后台回复「资料」免费获取
last 命令只能统计用户的登陆记录,但不能统计用户的登陆时长。若是想统计每一个用户的登陆时长,那么就要使用另外一个命令了:ac
命令。
ac 命令使用方法很简单,只需在 ac 后面跟上你想统计的用户便可,以下:
$ ac alex total 31.61
这个结果表示用户 alex 在这台电脑上的总登陆时长是 31.61 小时(ac 命令统计出来的结果默认单位是 小时
)。
咱们能够仿照上面写出统计每一个用户登陆时长的命令:
$ for user in `ls /home`; do ac $user | sed "s/total/$user\t/" ; done dorothy 9.12 dory 1.67 eel 4.32 …
一样地,这里先获取 home 目录下全部用户名,而后再将这些用户名做为参数传给 ac 命令,就能够统计出来全部每一个用户的登陆时长了。
咱们能够从上面的 ac 命令结果看到,它的执行结果都是 total + 时长
,若是全部用户的结果都这样,那么咱们就没法区别谁是谁了。因此咱们在这里再使用 sed
命令,将 total 替换为具体的用户名,以做区分。
这里还有个小小的瑕疵,就是每一个用户名以前会空出几个空格,虽然不影响结果,但看起来有点别扭,咱们能够再使用一个 sed
命令将其去掉。
$ for user in `ls /home`; do ac $user | sed "s/^\t//" | sed "s/total/$user\t/" ; done dorothy 9.12 dory 1.67 eel 4.32 ...
一样地,咱们能够将以上命令写成脚本,后面就能够更方便使用。这里咱们所使用的脚本名称是 show_user_hours.sh
,固然你能够自定义。
#!/bin/bash echo -n "hours online since " who /var/log/wtmp | head -1 | awk '{print $3}' echo "=============================" for user in `ls /home` do ac $user | sed "s/^\t//" | sed "s/total/$user\t/" done
脚本的执行结果以下,一样与手敲命令结果一致:
$ ./show_user_hours hours online since 2019-12-05 ============================= dorothy 70.34 dory 4.67 eel 17.05 jadep 186.04 jdoe 28.20 jimp 11.49 alex 11.61 shark 13.04 liangxu 3563.60 test 1.00 waynek 312.00
经过第二招,摸鱼的小伙伴已经无处遁形,并受到了 100 点伤害:
写完这两个脚本,我十分开心,因而跑过去找老板领功。看着本身两个都是排名第一,我估计升职加薪,迎娶白富美的日子不远了!
老板看了个人脚本和结果,依然一副朱一旦式的枯燥笑容,默默地给我看一眼朱一旦开除十佳员工的视频,意味深长地看着我……
完了……