您如何将良性用户赶出系统?


66

我之前在Google上进行了搜索,并注意到了几种方法,但是我猜想Google并不了解全部。那么,如何踢用户关闭你的Linux机器?还如何去看看他们首先登录?和相关...如果用户登录到X11 DE,您的方法是否有效(这不是我只是好奇的要求)?


3
更改了问题以反映给定接受答案的假设。在安全漏洞的情况下,将恶意用户踢出系统的唯一方法是比该用户聪明得多。聪明的用户不会让自己出现在utmp中,也不会被诸如who(1)或的琐碎事情发现w(1)。摆脱可能安装的任何潜在rootkit的唯一简便方法是完全擦除并重新安装系统。
jw013

Answers:


139

可能有一种更简单的方法,但是我这样做:

  1. 查看谁登录了您的计算机-使用whow

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. 查找其TTY连接到的Shell的进程ID:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. 嘲笑他们即将断开连接(此步骤是可选的,但值得鼓励)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. 杀死相应的进程:

    > kill -9 30737
    

我刚刚发现,你可以通过给合并步骤1和2 who-u标志; PID是右边的数字:

> who -u
mmrozek  tty1         Aug 17 10:03 09:01        9250
mmrozek  pts/18       Aug 17 10:09 01:46       19467 (:pts/2:S.0)

61
为“嘲笑他们即将断开的连接(此步骤是可选的,但
乔什(Josh

9
kill -9,是吗?您真的在这一模式上处于BOFH模式。
詹德(Jander)

12
@Jander您正在将用户踢出系统;您需要做多好?
Michael Mrozek

6
通常,我想说的是不鼓励人们去虐待kill -9,而是从温和的信号开始,但是我想在这种情况下没什么关系。如果人们错过了这个笑话,我只是发表评论。
jw013

5
还有一个杀手,它基本上可以使整个过程自动化(如果启用了傻瓜模式,甚至可以取笑您的受害者)
Ulrich Dangel 2012年

32

正如Micheal指出的那样,您可以who用来查找谁已登录。但是,如果它们具有多个进程,则比单独杀死每个进程还有一种更方便的方法:您可以killall -u username用来杀死该用户的所有进程。


+1。killall在图形环境中,使用也将更加合适,因为要杀死的不仅仅是shell。
约翰·史密斯

3
警告:如果将其用于root用户,则将杀死所有root进程,并且需要物理上重新启动服务器。
Kunok

@Kunok您想在哪种情况下将root用户踢出计算机?就像该帐户被劫持一样?
Alexej Magura

23

死灵法师!

我很欣赏所接受答案的幽默感,但从专业上讲,我不能倡导它。

我知道的最优雅的方法是向外壳发送-HUP来模拟用户挂断。您可以将其发送到用户的空闲sshd以模拟其连接丢失,从而触发对整个外壳环境(包括子外壳)的清理,或将其发送到特定的嵌套外壳(例如,在断开连接的终端多路复用器内部设置的外壳)如果您想精确的话,可以避免卸载文件系统。

但是write,在启动之前,使用将消息发送到终端闲置的pty 一个有趣的爱好。


1
虽然伴随杀死-9的伪全能感觉很有趣,但是这个建议可能更好。来自我的投票。
安德鲁·法兰加

4
为了使这个答案更明确,我所做的是:( echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP睡眠使用户有机会保存并注销,但是您可能只对那些忘记了注销的用户使用该密码)
wkschwartz 2014年

13

注销用户“用户名”:

skill -KILL -u username

看到 man skill


3
我认为这将杀死该用户的所有进程,而不仅仅是它们的shell,但是如果您
要这样做,

我真的没有在RHEL7上看到这个功能
antivirtel

11

其他有用的命令在pkill这里pkill -u username && pkill -9 -u usernamekillall缺点是在Solaris IIRC上它意味着完全不同的东西-也pkill有一些更高级的选项。


8
在Solaris上,关闭脚本使用'killall'杀死(几乎)服务器上的所有进程。“它按照锡罐上的说明去做。”
dr-jan

伙计们,为什么您那么喜欢SIGKILL?运行程序和应用程序甚至没有机会保存数据并进行一些清理。SIGTERM(如在关闭时使用的)或SIGHUP也会这样做,并且更加优雅。(您可以在宽限期届满后仍然可以发送SIGKILL。)
反模式

3

首先,这表明存在更大的问题。如果您有不信任您的系统的用户,则可能应该对其进行级别调整并重新映像。

考虑到这一点,您可以执行以下一些或全部操作:

#设置环境
$ BADUSER = foo#其中foo是有问题的用户名
$ USERLINE = $(grep'^ $ {BADUSER}:'/ etc / passwd)
$ BADUID = $(echo $ {USERLINE} | awk -F:'{print $ 3}')
$ BADGID = $(echo $ {USERLINE} | awk -F:'{print $ 4}')
$ BADHOMEDIR = $(echo $ {USERLINE} | awk -F:'{print $ 6}')
$ BDIR =“〜/ backup / home-backup /”
$ TSTAMP = $(日期+%F)
$ TAR_FILENAME =“ $ {BADUSER}-$ {TSTAMP} .tar.bz2”
$ OWNED_FILENAME =“ $ {BADUSER} -files-$ {TSTAMP} .txt”

#禁用用户将来的登录
$ sudo chsh -s / bin / false“ $ {BADUSER}”

#杀死用户的所有进程
$ BADPROCS = $(ps auwx | grep'^ $ {BADUSER}'| awk'{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

#备份/清除用户的主目录
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

#查找用户拥有的所有文件
$ sudo find / -user $ {BADUSER}>〜/ backup / $ {OWNED_FILENAME}

#删除用户
$ sudo userdel $ {BADUSER}

我不知道我是否同意“将它重新成像”,这是unix而不是Windows……我真的没有这个问题……我只是在问。
xenoterracide 2010年

3
另外,仅因为您必须将用户踢开,并不一定意味着他们是不可信的。也许他们只是忘记了注销。
David Z 2010年

xenoterracide:也许我只是保护自己所维护的系统,但是如果我有一个我认为需要从我控制下的系统中强行删除该用户,那肯定会发生一些严重的事情。
cjac

-1用于将问题读入逻辑上不遵循的问题并将Q / A拖离主题。
韦斯利

you have users that you don't trust on your system...或者可能是您正在杀死一个作为向其他人传达的信息。毕竟,系统管理员的信条是否不是“被恐惧比被爱更好”?除了开玩笑,马基雅维利还应该写一本奥赖利的书。
Parthian Shot

0

我环顾四周,找不到单个脚本来自动执行此任务。

因此,基于此处提出的解决方案,我将所有内容混合在一个交互式Bash脚本中,该脚本列出了用户和会话,who -u供用户选择要执行的操作。

然后,您可以:

  • 杀死用户的所有会话 killall -u <username> -HUP
  • 杀死特定的会话 kill <PID>

所有必需的信息都来自who -u,然后使用mapfile和进行解析awk

我将添加write以后使用发送消息的可能性(延迟分叉过程)。

我可能还会添加选项以终止特定的会话kill -9。但我没有公正的问题,正如kill其他人指出的那样,kill -9应尽可能避免。

如果您想尝试一下,可以查看github上的代码,或者了解有关我如何以自动化方式进行操作的更多信息:


0

那么,如何将[良性]用户踢出Linux系统呢?

最后,归结为识别并结束那些由用户ID拥有,关联或产生的进程。只要达到目标,您用来达到最终目标的任何命令都不一定重要。

基本上有两个答案...

选项A: 导致该用户注销,无论他们拥有多少次登录。因此,这意味着要标识那些用户拥有的,可由uid跟踪的进程,并归类为您正在运行的给定Linux发行版的某些登录进程的一部分。请意识到在“登录”之前有诸如SSH或VNC之类的父进程,在“登录”之后有诸如GDM之类的子进程通常,杀死父进程会杀死子进程,但并非总是如此。因此,您想杀死注销后显然不再需要的其他进程。在执行所有这些操作时,这将使后台作业保持运行状态,因为它是一个友好的用户,也许您只想注销它们即可。据我所知,/usr/bin/w并且/usr/bin/who将报告谁已经通过登录过程通过。

选项B:完全 终止特定uid拥有的所有进程,这仅意味着杀死该用户拥有的所有进程,如果已登录,这也将注销它们。这将使它们退出系统。只需简单ps -ef | grep <uid>,然后以可接受的任何方式结束所有这些过程。

报告SLES 11

人的技能...这些工具可能已过时且不可移植。命令语法定义不正确。考虑改用killall,pkill和pgrep命令。

kill -9 FTW!


-1

在我看来,使用它并不是真正有用,killall -u username因为如果您与您是同一用户,那么您将自己开始。因此,kill该过程将是更好的解决方案。


同样,如果有该用户运行的进程,也许您永远不会进入SSHD,从而导致SSH关闭。
Mailo 2013年

3
为什么在地球上,SSH守护程序(或任何守护程序)将使用出于任何现实原因而需要被强制注销系统的用户凭据运行?此外,此答案还补充了迈克尔·姆罗泽克Michael Mrozek)的答案安德鲁·BAndrew B)的答案(以及其他答案)未涵盖的内容吗?
CVn

-2

此命令对GUI非常有用,但我的“重要”拒绝退出...

leaves@me:/# skill -HUP -u username
  • 我不知道发生了什么
  • 必须有一个更新。
  • “ Google”再次关闭。
  • 它是InterWebs上的病毒。

一些转移,以备不时之需。


1
bsd的答案​​中已经提到了这一点。
Stephen Kitt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.