我如何找到谁以 root 身份登录?

我如何找到谁以 root 身份登录?

最近,我问过“如何列出已登录的用户?“该命令who非常适合此目的。但是我如何找到谁以 root 身份登录?用户名是“root”吗?

答案1

我认为帐户未启用(默认情况下),因此仅sudo -i适用于用户成为。我的建议是使用以下脚本来执行命令who -upgrep -at <tty parsed from who -u>查找哪个user在哪个上tty执行了该命令sudo -i

#!/bin/bash
LANG=C who -u | while read -a line; do  # Output the whole line: echo "${line[@]}"
        IS_ROOT="$(pgrep -at "${line[1]}" | grep 'sudo -i')"
        [[ ! -z "${IS_ROOT}" ]] && printf '%-7s ( PID %-6s at %s on TTY %-7s) is ROOT: %s %s\n' "${line[0]}" "${line[5]}" "${line[4]}" "${line[1]}" "$IS_ROOT"
done | sed '/grep sudo -i/d' | sort -k13 -k6

解释:

  • who -u显示已登录的用户及其会话的 PID。可能LANG=C不是强制性的 - 它是为了保证在具有不同locale设置的机器上时间/日期格式相同。

  • 当有流时,循环while将执行命令do标准输入

  • 该命令read -a将逐行读取输入流,并将这些行作为数组分配给“多变的” $line。我们可以通过命令输出整行:echo "${line[@]}"。所以${line[1]}意味着数组的第二个变量$line(第一个是0)。在当前情况下${line[1]}终端电话来自 的输出who -u

  • 这是一个简单的脚本,它将输出一个“表”,其中包含数组元素及其值之间的关系:

    line=( $(LANG=C who -u | head -1) ); for i in {0..6}; do printf '%-11s' "${line[$i]}"; done; echo; for i in {0..6}; do printf '${line[%s]} ' "$i"; done; echo
    
    guest      tty7       2018-01-03 09:52      old        1847       (:0)
    ${line[0]} ${line[1]} ${line[2]} ${line[3]} ${line[4]} ${line[5]} ${line[6]}
    
  • 该命令的输出pgrep -at "${line[1]}" | grep 'sudo -i'将被签名为$()变量的值$IS_ROOT

  • 该命令pgrep -at "TTY"将输出某个 TTY 上所有进程的 PID - 选项-t --terminal,并且该选项-a --list-name将列出 PID 和进程名称。

  • 该表达式[[ ! -z "${IS_ROOT}" ]] &&可以这样理解:如果[变量"${IS_ROOT}"!为空-z,则&&否则||

  • printf命令用于格式化输出(参考):

    printf '%s some text %s` "$var1" "$var2"
    
  • 最后,将从输出中sed '/grep sudo -i/d'删除无人值守的行(包含我们的命令) ,并按第 13 列和第 6 列对输出进行排序。grep 'sudo -i'whilesort -k13 -k6


调用脚本find-root,使其可执行(chmod +x find-root)并执行它。

这是一个简单的输出:

$ ./find-root
spas    ( PID 14035  at 12:54 on TTY pts/20 ) is ROOT: 23518 sudo -i
spas    ( PID 14035  at 12:36 on TTY pts/4  ) is ROOT: 23589 sudo -i
guest   ( PID 23575  at 15:00 on TTY pts/4  ) is ROOT: 23589 sudo -i
guest   ( PID 24321  at 15:30 on TTY tty1   ) is ROOT: 24386 sudo -i

mutt以下是(在会话中)该脚本如何工作的演示(在之前的版本中):

在此处输入图片描述


将脚本放入/usr/local/bin以使其可用作 shell 命令。为此,请复制并执行以下几行作为单个命令:

cat << EOF | sudo tee /usr/local/bin/find-root && sudo chmod +x /usr/local/bin/find-root
#!/bin/bash
LANG=C who -u | while read -a line; do 
        IS_ROOT="\$(pgrep -at "\${line[1]}" | grep 'sudo -i')"
        [[ ! -z "\${IS_ROOT}" ]] && printf '%-7s ( PID %-6s at %s on TTY %-7s) is ROOT: %s %s\n' "\${line[0]}" "\${line[5]}" "\${line[4]}" "\${line[1]}" "\$IS_ROOT"
done | sed '/grep sudo -i/d' | sort -k13 -k6
EOF

解释:

  • cat << EOF除非遇到字符串,否则命令将输出下一行EOF。请注意,反斜杠\$将转义特殊字符$,并且它将在 cat 中按字面意思输出。

  • 该输出将通过管道传输到写入文件的命令(由执行)|的标准输入。teesudo/usr/local/bin/find-root

  • 如果前一个命令成功,&&该命令suddo chmod +x将被执行。


也可以看看:

答案2

在 Ubuntu 上,登录root帐户是禁用的,但是sudo用户仍然可以通过 以 root 身份登录sudo -i。但是, Ubuntu 上的whow命令都不会显示您以 root 身份登录:

$ sudo -i
[sudo] password for xieerqi: 
$ who
xieerqi  tty7         2017-11-27 23:39 (:0)
xieerqi  pts/14       2017-11-27 23:39 (:0)
xieerqi  pts/0        2017-11-28 00:25 (:0)

pts/14这里我通过登录sudo -i,但我的原始用户名仍然存在。但是,可以做的是过滤进程列表以找到在该终端上运行的 shell。当然,该进程将以 root 身份运行。

$ ps -u root | awk '$2 ~ /pts/'                                                                
 4170 pts/14   00:00:00 sudo
 4172 pts/14   00:00:00 bash

这样,通过交叉引用,您就可以找出谁在终端中以 root 身份登录。请记住,tty如果有 root 用户登录,您还应该将 awk 命令包含在内tty

另一个方法是/var/log/auth.log按照其他答案中的建议进行过滤:

awk '/USER=root/' /var/log/auth.log

但是,这是一个日志文件。它只显示谁登录了或登录失败,而不显示谁的目前是在超级用户级别。

答案3

输入

sudo less /var/log/auth.log

从那里你可以浏览所有登录信息,包括那些访问 root 的用户

答案4

通常在 Ubuntu 中,超级用户或 Root 帐户名为 root,但被系统锁定,您无法登录。回答您的问题,是的,用户名将是 root,尽管如果不解锁就无法使用它。

要解锁,请在终端中输入以下内容:

sudo -i

然后为root设置密码:

sudo passwd root

更多相关信息请参见:

https://help.ubuntu.com/community/RootSudo

相关内容