「Linux」- 强制用户下线

  CREATED BY JENKINSBOT

内容简介

本文将介绍如何显示已登录系统的用户,以及如何强制已登录用户下线。

问题描述

之前有些开发拿到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?