最近,我问过“如何列出已登录的用户?“该命令who
非常适合此目的。但是我如何找到谁以 root 身份登录?用户名是“root”吗?
答案1
我认为根帐户未启用(默认情况下),因此仅sudo -i
适用于用户成为根。我的建议是使用以下脚本来执行命令who -u
并pgrep -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'
while
sort -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 中按字面意思输出。该输出将通过管道传输到写入文件的命令(由执行)
|
的标准输入。tee
sudo
/usr/local/bin/find-root
如果前一个命令成功,
&&
该命令suddo chmod +x
将被执行。
也可以看看:
答案2
在 Ubuntu 上,登录root
帐户是禁用的,但是sudo
用户仍然可以通过 以 root 身份登录sudo -i
。但是, Ubuntu 上的who
和w
命令都不会显示您以 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
更多相关信息请参见: