it-swarm.cn

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

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

68
xenoterracide

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

  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
    

我刚刚发现可以通过给who-u标志来组合步骤1和2; 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)
147
Michael Mrozek

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

33
sepp2k

死灵法师!

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

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

在启动它们之前,使用write将消息发送到终端空闲的pty is一个有趣的爱好。

23
Andrew B

注销用户“用户名”:

skill -KILL -u username

man skill

13
bsd

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

11
Maciej Piechotka

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

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

#设置环境
 $ BADUSER = foo#其中foo是有问题的用户名
 $ USERLINE = $(grep'^ $ {BADUSER}:'/ etc/passwd )
 $ BADUID = $(echo $ {USERLINE} | awk -F:'{print $ 3}')
 $ BADGID = $(echo $ {USERLINE} | awk -F:'{打印$ 4}')
 $ BADHOMEDIR = $(echo $ {USERLINE} | awk -F:'{print $ 6}')
 $ BDIR =“〜/ backup/home-backup /” 
 $ TSTAMP = $(date +%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查找/ -user $ {BADUSER}>〜/ backup/$ {OWNED_FILENAME} 
 
#删除用户
 $ Sudo userdel $ {BADUSER} 
3
cjac

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

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

然后,您可以:

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

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

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

我可能还会添加一个选项,以杀死带有kill -9的特定会话。但是我对kill没问题,正如其他人指出的那样,如果可能,应避免kill -9

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

0
Gus Neves

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

0
Mailo

那么,如何将[良性]用户踢出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!

0
ron