Linux用户帐户监控

很久以前,在UNIX历史中,服务器上的用户是实际的UNIX用户,其中包含条目,/etc/shadow交互式登录外壳和主目录。管理员可以使用一些工具与用户进行交流,并监视他们的活动,以避免可能导致服务器资源被不公平分配的愚蠢或恶意错误。

如今,您的用户群不太可能在中拥有条目/etc/shadow,而由LDAPDrupalOpenShift等抽象层进行管理。再说一遍,现在有更多的服务器,这意味着有更多的系统管理员登录和注销以执行维护。哪里有活动,哪里就有犯错和混乱的机会,所以现在该清理那些旧的监视工具并加以利用了。

以下是一些您可能忘记(或从未听说过)的监视命令,以帮助您跟踪服务器上正在发生的事情。

WHO

首先,基础知识。

who命令由GNU coreutils包提供,其主要工作是解析/var/log/utmp文件并报告其发现。

utmp文件记录系统上的当前用户。它不一定显示每个进程,因为不是所有程序都启动utmp日志记录。实际上,utmp默认情况下,您的系统甚至可能没有文件。在这种情况下,who回退到/var/log/wtmp,它将记录所有登录和注销。

wtmp文件格式是完全一样的utmp,只是一个空的用户名指示注销和~字符表示系统关机或重启。该wtmp文件由login(1)init(1)和维护getty(8),但是某些版本的,这些应用程序均未创建该文件,因此,如果删除wtmp,则记录保持功能将被停用。知道这一点是很高兴的:如果wtmp丢失了,您应该找出原因!

的输出who --heading看起来像这样:

NAME     LINE     TIME               COMMENT

seth     tty2     2020-01-26 18:19   (tty2)

larry    pts/2    2020-01-28 13:02   (10.1.1.8)

curly    pts/3    2020-01-28 14:42   (10.1.1.5)

这将向您显示每个登录用户的用户名,登录时间和IP地址。

who命令还虚心地提供了正式的POSIX方法来发现以哪个用户身份登录,但前提是utmp存在该用户:

$ who -m

curly   pts/3   2020-01-28 14:44 (10.1.1.8)

它还提供了一种显示当前运行级别的机制:

$ who -r

     run-level 5   2020-01-26 23:58

w

有关用户的更多信息,简单的w命令提供了登录者及其正在执行的操作的列表。该信息的显示格式类似于的输出who,但是用户空闲的时间,登录到TTY的所有进程所使用的CPU时间以及仅当前进程所使用的CPU时间。用户的当前过程列在最后一个字段中。

样本输出:

$ w

 13:45:48 up 29 days, 19:24,  2 users,  load average: 0.53, 0.52, 0.54

USER     TTY     LOGIN@  IDLE    JCPU   PCPU WHAT

seth     tty2    Sun18   43:22m  0.01s  0.01s /usr/libexec/gnome-session-binary

curly    pts/2   13:02   35:12   0.03s  0.03s -bash

或者,您可以使用-i--ip-addr选项查看用户的IP地址。

您可以通过指定所需的用户信息来将输出范围缩小到单个用户名:

$ w seth

 13:45:48 up 29 days, 19:27,  2 users,  load average: 0.53, 0.52, 0.54

USER     TTY     LOGIN@  IDLE    JCPU   PCPU WHAT

seth     tty2    Sun18   43:250.010.01s /usr/libexec/gnome-session-binary

utmpdump

utmpdump实用程序(几乎)确实如其名称所示:将/var/log/utmp文件内容转储到屏幕上。事实上,它转储无论是utmpwtmp文件,这取决于您指定。当然,您指定的文件不必位于,/var/log甚至不必命名为utmpwtmp,并且甚至不必具有正确的格式。如果utmpdump输入文本文件,它将以--output可预测且易于解析的格式将内容转储到屏幕(或带有选项的文件)中。

当然,通常,通常只使用whow解析登录记录,但utmpdump在许多情况下很有用。

  • 文件可能会损坏。尽管who并且w通常能够自己检测到腐败,但是utmpdump由于它本身不会进行解析,因此容忍度越来越高。它将呈现原始数据供您处理。
  • 修复损坏的文件后,utmpdump可以修补您的更改。
  • 有时您只想自己解析数据。也许您正在寻找某些东西,whow这些东西并未经过编程即可寻找,或者您正试图自己建立关联。

无论出于何种原因,它utmpdump都是从登录记录中提取原始数据的有用工具。

如果您修复了损坏的登录日志,则可以使用utmpdump将更改写回到主日志中:

$ sudo utmpdump -r < wtmp.fix > /var/log/wtmp

ps

一旦知道谁在系统上登录,就可以使用它ps来获取当前进程的快照。不要将它与top混淆,top显示当前进程的运行报告;这是ps发布后拍摄的快照,然后打印到屏幕上。两者都有优点和缺点,因此您可以根据需要选择使用哪种。由于其静态性质,ps对于以后的分析或作为一个很好的可管理的摘要特别有用。

ps命令是古老的,众所周知的,似乎许多管理员已经学会了旧的UNIX命令,而不是最新的实现。现代的ps(来自procps-ng软件包)提供了许多有用的助记符,这是RHELCentOSFedora和许多其他发行版上附带的,因此本文将使用它。

您可以使用--user(或-u)选项让单个用户运行所有进程,以及您想要报告的用户名。要为输出提供哪个进程是子进程的父进程的附加上下文,请使用--forest视图选项:

$ ps --forst --user larry

  PID TTY        TIME     CMD

  39707 ?        00:00:00 sshd

  39713 pts/4    00:00:00  \_ bash

  39684 ?        00:00:00 systemd

  39691 ?        00:00:00  \_ (sd-pam)

对于系统上的每个进程:

$ ps --forest -e

[...]

  29284 ?        00:00:48  \_ gnome-terminal-

  29423 pts/0    00:00:00  |   \_ bash

  42767 pts/0    00:00:00  |   |   \_ ps

  39631 pts/1    00:00:00  |   \_ bash

  39671 pts/1    00:00:00  |       \_ ssh

  32604 ?        00:00:00  \_ bwrap

  32612 ?        00:00:00  |   \_ bwrap

  32613 ?        00:09:05  |       \_ dring

  32609 ?        00:00:00  \_ bwrap

  32610 ?        00:00:15      \_ xdg-dbus-proxy

   1870 ?        00:00:05 gnome-keyring-d

   4809 ?        00:00:00  \_ ssh-agent

[...]

默认列很有用,但是您可以更改它们以更好地适应您正在研究的内容。该-o选项使您可以完全控制看到的列。有关可能的列的完整列表,请参考ps1手册页的标准格式说明符部分。

$ ps -eo pid,user,pcpu,args --sort user

   42799 root      0.0 [kworker/u16:7-flush-253:1]

  42829 root      0.0 [kworker/0:2-events]

  42985 root      0.0 [kworker/3:0-events_freezable_power_]

   1181 rtkit     0.0 /usr/libexec/rtkit-daemon

   1849 seth      0.0 /usr/lib/systemd/systemd --user

   1857 seth      0.0 (sd-pam)

   1870 seth      0.0 /usr/bin/gnome-keyring-daemon --daemonize --login

   1879 seth      0.0 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session

ps命令非常灵活。您可以本地修改其输出,因此您不必依赖grepawk找到您关心的内容。制定一个好的ps命令,将其作为难忘的别名,然后经常运行。这是随时了解服务器上正在发生的事情的最佳方法之一。

pgrep

有时,您可能对有问题的过程有所了解,需要进行调查而不是用户或系统。为此,请pgreppsproc-ng包中获取命令。

最基本的说,它pgrepgrep的输出ps

$ pgrep bash

29423

39631

39713

无需列出PID,您只需获取将返回多少PID的计数即可:

$ pgrep --count bash

3

有关更多信息,您可以通过用户名(-u),终端(--terminal)和年龄(--newest--oldest)等来影响搜索过程。查找属于特定用户的进程,例如:

$ pgrep bash -u moe --list-name

39631 bash

您甚至可以使用--inverse选项获得逆向匹配。

pkill

pgreppkill命令相关。它与kill命令非常相似,不同之处在于它使用的选项相同,pgrep因此您可以使用最适合您的信息将信号发送到麻烦的过程。

例如,如果你已经发现,通过用户启动了一个进程larry独占资源,你知道从w那个larry位于终端pts/2,则可以中止登录会话及其所有的孩子只用终端名称:

$ sudo pkill -9 --terminal pts/2

或者,您可以仅使用用户名结束与之匹配的所有进程:

$ sudo pkill -u larry

pkill当问题失控时,明智地使用它是一个很好的应急按钮或大锤式解决方案。

终端监控

仅仅因为终端中存在一系列命令并不意味着它们一定比其他解决方案要好。盘点您的需求,并根据需要选择最佳工具。有时候,图形监控和报告系统正是您所需要的,而有时,易于编写脚本和解析的终端命令才是正确的答案。明智地选择,学习您的工具,您将永远不会对裸机中发生的事情有所了解。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值