Linux 命令之who、who am i、whoami 的区别

在 Linux 中,我们知道通常查询用户信息的命令有 id、who、who am i、whoami。

那么,这几个用户信息的查询命令有什么区别?

我们用 man 命令查询一下四个命令,看一下帮助手册对他们的描述。

$ man id

NAME
            id - print real and effective user and groups
$ man who

NAME
            who - show who is logged on
            
# 同时,在 who 的帮助手册中,我们发现一下信息

DESCRIPTION
            (省略)
            -m      only hostname and user associated with stdin
            (省略)
            If  ARG1  ARG2  given, -m presumed: 'am i' or 'mom likes' are usual.

说明,who am i 仅显示请求执行该命令的登录用户的信息

$ man whoami

NAME
            whoami - print effective userid

在帮助手册的描述中,我们可以总结:

  • id 可以查询有效用户的 UID 和 GID、groups 信息
  • who 可以查询当前登录在系统上的登录用户的信息
  • who am i 等同于 who -m,只打印执行该命令的登录用户的信息
  • whoami 可以查询当前有效用户的名字

我们来看一下具体例子。

假设我以 root 用户身份登录,分别执行上述四个命令,则有:

$ id
uid=0(root) gid=0(root) groups=0(root)

$ who
root        tty1        2020-02-04 16:00
root        pts/0       2020-02-06 17:30

$ who am i
root        pts/0       2020-02-06 17:30

$ whoami
root

我们先不着急发现和总结它们之间的差别,再继续做另一个实验。

我们用 su 命令切换到另一个用户 test,并重复上述命令

$ su - test

$ id
uid=1001(test) gid=1002(test) groups=1002(test)

$ who
root        tty1        2020-02-04 16:00
root        pts/0       2020-02-06 17:30

$ who am i
root        pts/0       2020-02-06 17:30

$ whoami
test

结合前述对帮助手册的查询,以及对实验的观察,我们发现:

id 命令显示的是切换后的用户信息(有效用户信息);

who 命令仍然显示所有登录用户(所有登录用户信息);

who am i 命令仍然显示切换前的用户信息(执行命令的登录用户的信息);

whoami 命令显示的是切换后的用户信息(有效用户信息);

针对上述现象,我们需要解释几个问题:

1、为什么切换到 test 用户后,who 命令却没有 test 用户的相关信息?

答:在 Linux 中,以 su 命令切换用户后,并没有登录切换后的用户,而是在原来用户的进程中创建了子进程执行命令,所以 test 用户并没有登录

2、切换到 test 用户后,who am i 命令为什么仍然显示 root 的信息,而 whoami 却显示 test 用户的信息?

答:who am i 命令显示的是登录用户的信息,在这个案例中,登录用户仍然是 root,test 用户并没有登录;而切换身份后,有效用户变为 test,whoami 显示的也是有效用户的信息。这两个命令是有区别的

总结

  • id 可以查询有效用户的 UID 和 GID、groups 信息
  • who 可以查询当前登录在系统上的登录用户的信息
  • who am i 等同于 who -m,只打印执行该命令的登录用户的信息
  • whoami 可以查询当前有效用户的名字

(完)

本文为原创文章,若要转载请原链转载,并告知作者

欢迎关注我的微信公众号、知乎:多面手程序员

若您觉得该文还不错,随手点赞,手有余香,嘻嘻 : )

你可能感兴趣的:(Linux 命令之who、who am i、whoami 的区别)