Answers:
可能有一种更简单的方法,但是我这样做:
查看谁登录了您的计算机-使用who
或w
:
> who
mmrozek tty1 Aug 17 10:03
mmrozek pts/3 Aug 17 10:09 (:pts/2:S.0)
查找其TTY连接到的Shell的进程ID:
> ps t
PID TTY STAT TIME COMMAND
30737 pts/3 Ss 0:00 zsh
嘲笑他们即将断开连接(此步骤是可选的,但值得鼓励)
> echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
杀死相应的进程:
> 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)
kill -9
,是吗?您真的在这一模式上处于BOFH模式。
kill -9
,而是从温和的信号开始,但是我想在这种情况下没什么关系。如果人们错过了这个笑话,我只是发表评论。
正如Micheal指出的那样,您可以who
用来查找谁已登录。但是,如果它们具有多个进程,则比单独杀死每个进程还有一种更方便的方法:您可以killall -u username
用来杀死该用户的所有进程。
killall
在图形环境中,使用也将更加合适,因为要杀死的不仅仅是shell。
死灵法师!
我很欣赏所接受答案的幽默感,但从专业上讲,我不能倡导它。
我知道的最优雅的方法是向外壳发送-HUP来模拟用户挂断。您可以将其发送到用户的空闲sshd以模拟其连接丢失,从而触发对整个外壳环境(包括子外壳)的清理,或将其发送到特定的嵌套外壳(例如,在断开连接的终端多路复用器内部设置的外壳)如果您想精确的话,可以避免卸载文件系统。
但是write
,在启动之前,使用将消息发送到终端闲置的pty 是一个有趣的爱好。
echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP
睡眠使用户有机会保存并注销,但是您可能只对那些忘记了注销的用户使用该密码)
注销用户“用户名”:
skill -KILL -u username
看到 man skill
首先,这表明存在更大的问题。如果您有不信任您的系统的用户,则可能应该对其进行级别调整并重新映像。
考虑到这一点,您可以执行以下一些或全部操作:
#设置环境 $ 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}
you have users that you don't trust on your system
...或者可能是您正在杀死一个作为向其他人传达的信息。毕竟,系统管理员的信条是否不是“被恐惧比被爱更好”?除了开玩笑,马基雅维利还应该写一本奥赖利的书。
我环顾四周,找不到单个脚本来自动执行此任务。
因此,基于此处提出的解决方案,我将所有内容混合在一个交互式Bash脚本中,该脚本列出了用户和会话,who -u
供用户选择要执行的操作。
然后,您可以:
killall -u <username> -HUP
kill <PID>
所有必需的信息都来自who -u
,然后使用mapfile
和进行解析awk
。
我将添加write
以后使用发送消息的可能性(延迟分叉过程)。
我可能还会添加选项以终止特定的会话kill -9
。但我没有公正的问题,正如kill
其他人指出的那样,kill -9
应尽可能避免。
如果您想尝试一下,可以查看github上的代码,或者了解有关我如何以自动化方式进行操作的更多信息:
那么,如何将[良性]用户踢出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!
在我看来,使用它并不是真正有用,killall -u username
因为如果您与您是同一用户,那么您将自己开始。因此,kill
该过程将是更好的解决方案。
此命令对GUI非常有用,但我的“重要”拒绝退出...
leaves@me:/# skill -HUP -u username
一些转移,以备不时之需。
who(1)
或的琐碎事情发现w(1)
。摆脱可能安装的任何潜在rootkit的唯一简便方法是完全擦除并重新安装系统。