Contents

在Linux中获取当前用户

1. 概述

当我们在 Linux 命令行上工作时,有时我们想知道当前用户是谁。此外,当我们编写一个 shell 脚本时,我们可能想知道谁在运行这个脚本。

在本教程中,让我们弄清楚如何在 Linux 中识别当前用户。

2. 问题介绍

各种命令可以获取 Linux 中的当前用户。我们将在本教程中探讨其中的一些。此外,对于每种方法,我们将讨论如果我们使用su 命令更改为另一个用户,它们会报告什么。

此外,我们不应该忘记 sudo 命令也可能隐藏真实用户。因此,我们将讨论如果被sudo调用的各种方法将打印什么。

接下来,让我们看看他们的行动。

3. 读取*$USER*变量

在我们通过登录 shell 登录到 Linux 系统后,系统会通过当前登录用户设置*$USER环境变量。因此,我们可以读取$USER*变量来获取当前用户的名字:

kent$ echo $USER
kent

3.1. 执行su命令后

由于su命令默认不调用登录 shell,如果我们使用su命令切换到 root,$USER变量仍然存储原始登录用户

kent$ echo $USER
kent
kent$ su
Password: 
root# echo $USER
kent

但是,如果我们执行 su USERNAME,将调用登录 shell。因此,$USER变量将保存我们切换到的USERNAME

kent$ su guest
Password: 
guest$ echo $USER
guest

3.2. 使用 sudo命令

当我们使用sudo执行命令时,我们以超级用户权限运行命令。所以,比如我们以用户kent登录,当我们执行sudo some-command时,登录用户仍然是kent,但有效用户是root

接下来,让我们看看在sudo的情况下*$USER*将存储 哪个用户。但是,首先,让我们创建一个非常简单的脚本:

$ cat user-by-var.sh
#!/bin/bash
echo "The current user by reading \$USER: $USER"

现在,让我们使用sudo执行脚本 :

$ sudo ./user-by-var.sh 
[sudo] password for kent: 
The current user by reading $USER: root

如上面的输出所示,如果我们的脚本使用 sudo执行,则$USER*变量保存有效用户 root*

3.3. $USER变量可以被覆盖

最后,我们应该记住*$USER*是一个环境变量。也就是说,我们可以随时覆盖它。因此,如果我们想在我们的 shell 脚本中获取当前用户,$USER是不可靠的。

接下来,让我们执行两次我们的小脚本,改变和不改变*$USER*变量:

kent$ ./user-by-var.sh
The current user by reading $USER: kent
kent$ USER=superman; ./user-by-var.sh 
The current user by reading $USER: superman

如上例所示,如果我们的脚本读取*$USER来获取当前用户,则用户可以通过更改$USER*变量轻松欺骗脚本。

4. 使用 whoami命令

whoami 命令在调用时打印当前用户的有效用户名

kent$ whoami
kent

4.1. 执行su命令后

我们调用su切换到root后,有效用户就变成了root。因此,$USER变量不同,whoami将打印root:**

kent$ su
Password: 
root# whoami
root

如果我们使用用户名执行 suwhoami也会打印用户名:

kent$ su guest
Password: 
guest$ whoami
guest

4.2. 使用 sudo命令

与*$USER变量 类似,如果我们使用 sudo执行whoami命令,它会报告有效的用户root*:

kent$ sudo whoami
[sudo] password for kent: 
root

5. 使用id命令

此外,id 命令可以打印真实有效的用户和组 id

kent$ id
uid=1000(kent) gid=1000(kent) groups=1000(kent),7(lp),10(wheel), ... 108(vboxusers),990(docker)

当然,如果我们只对用户名感兴趣,我们可以将-nu选项传递给id*命令*:

$ id -nu
kent

5.1.执行su命令后

whoami命令相同,在我们使用su切换到另一个后,  id命令将打印新用户的名称

kent$ su
Password: 
root# id -nu
root
kent$ su guest
Password:
guest$ whoami
guest

5.2. 使用 sudo命令

由于id命令报告真实用户和有效用户, 如果我们使用 sudo命令运行它,它将打印root

kent$ sudo id -nu
[sudo] password for kent:
root

6. 使用 logname命令

logname  是 coreutils 包的成员。顾名思义, **logname命令打印用户的登录名**:

kent$ logname
kent

6.1.执行su命令后

由于logname命令会打印用户的登录名,所以在我们向另一个用户“ su ”后,无论我们是否将用户名传递给su命令,logname命令仍然会报告原始登录用户

kent$ su
Password: 
root# logname
kent
kent$ su guest
Password: 
kent$ logname
kent

6.2. 使用 sudo命令

whoamiid命令不同,当我们使用sudo调用 logname时,它仍然会打印原始登录名

kent$ sudo logname
[sudo] password for kent: 
kent