内容简介
本文将介绍如何显示已登录系统的用户,以及如何强制已登录用户下线。
问题描述
之前有些开发拿到ROOT帐号。现在,要回收ROOT帐号,修改密码,并强制已登录用户下线。如果不强制下线,他们还可以使用ROOT用户继续操作。
解决办法
找到用户登录进程,然后结束这些进程即可。
#1 查看已登录用户
查看当前用户
#!/bin/sh ################################################################################ # 显示当前登录的用户的用户名 ################################################################################ whoami # 没有其他选项 ################################################################################ # 显示当前登录的用户的用户名 ################################################################################ id -un
上述命令是等价的,都显示了当前登录的用户。
查询已登录用户
#!/bin/sh ################################################################################ # 显示系统中登录的用户,及正在执行的动作 ################################################################################ w ################################################################################ # 显示当前登录的用户 ################################################################################ who ################################################################################ # 显示当前登录用户(特殊一些) # 没有其他的选项,功能单一。如果用户具有多个进程,则显示多次用户名。 ################################################################################ users
#2 结束登录用户
目前还没有发现直接找到用户登录进程的办法。这里我们只能拿到登录系统的用户的TTY或者PTS值,需要通过这些值来查找出进程。
准确办法
具体方法如下:
#!/bin/sh # 在所有的进程中,查找登录进程 ps -dN | grep -E $(who | awk '{printf "%s|", $2}')AAA # 关于「AAA」:因为在拼接正则表达式的时候结尾多了一个「|」,会导致所有的进程都匹配,所以添加了「AAA」字符串。 # 从这些进程中排除当前登录用户的进程 ps -dN | grep -E $(who | awk '{printf "%s|", $2}')AAA | grep -v $$ # 格式化输出,将进程ID显示在一行 ps -dN | grep -E $(who | awk '{printf "%s|", $2}')AAA | grep -v $$ | awk '{printf "%s ", $1}' # 最后结束所有的用户 kill -KILL $(ps -dN | grep -E $(who | awk '{printf "%s|", $2}')AAA | grep -v $$ | awk '{printf "%s ", $1}')
注意事项:
(1)使用$$获取当前进程。这里存在一个问题:在tmux(或者screen程序)中这是不可行的。
投机取巧
其实我们面对一般都是SSH帐号:
#!/bin/sh # 要死大家一起死: kill -KILL $(ps -auxwww | grep -E 'sshd:' | grep -v 'grep' | awk '{printf "%s ", $2}')
参考文献
4 Ways to Identify Who is Logged-In on Your Linux System
Force logout a user
How to get the process ID (PID) of a shell script
Did you ever face this situation, a lot of terminal connections to your server?
List all connected SSH sessions?