在 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
在帮助手册的描述中,我们可以总结:
我们来看一下具体例子。
假设我以 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 显示的也是有效用户的信息。这两个命令是有区别的。
(完)
本文为原创文章,转载请告知作者,未经授权请勿转载。
欢迎关注我的微信公众号、知乎:多面手程序员
如果您觉得这篇文章还不错,随手点赞,手有余香~ : )