老板对我说,你要是能找出公司里摸鱼的人,我就给你涨薪!因而我写了两个脚本……

最近老板沉迷于抖音,时不时在那边呵呵傻笑,因而我偷偷凑过去一看,好家伙,他正在看朱一旦~linux

这天,老板幽幽地走到我身边,淡淡地跟我说,良许,你要是能找到公司里混水摸鱼的人,我就给你涨薪!我回过头,望着他朱一旦似的枯燥笑脸,自信说道,放心,有我在,公司里就没有摸鱼的人!程序员

做为一名资深摸鱼专家,熟知 108 种摸鱼手段,精通 18 般躲避领导突击检查方法,因此,谁想摸鱼都逃不出个人火眼精睛。面试

做为一名 Linux 程序员,天天都要跟服务器打交道,那么想要找到谁在摸鱼,只要关注他的两个指标就行:shell

  • 登陆系统次数
  • 登陆系统时长

Linux 系统给咱们提供了大量很是实用的命令,固然有一些命令能够用来查看系统各用户在系统上登陆的次数,以及使用系统总时间。用户的这些信息是保存在 /var/log/wtmp 文件里,因此咱们就能够经过一些简单的命令把咱们想要的信息提取出来。vim

这些信息就是摸鱼的证据!bash

使用 last 命令获取用户登陆信息

一个能够实现这个目的的命令就是 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 点伤害:

后续

写完这两个脚本,我十分开心,因而跑过去找老板领功。看着本身两个都是排名第一,我估计升职加薪,迎娶白富美的日子不远了!

老板看了个人脚本和结果,依然一副朱一旦式的枯燥笑容,默默地给我看一眼朱一旦开除十佳员工的视频,意味深长地看着我……

完了……

看完的都是真爱,点个赞再走呗?您的「三连」就是良许持续创做的最大动力!

  1. 关注原创公众号「良许Linux」,第一时间获取最新Linux干货!
  2. 公众号后台回复【资料】【面试】【简历】获取精选一线大厂面试、自我提高、简历等资料。
  3. 关注个人博客:lxlinux.net
相关文章
相关标签/搜索