在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
如果我们使用用户名执行 su,whoami也会打印用户名:
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命令
与whoami和id命令不同,当我们使用sudo调用 logname时,它仍然会打印原始登录名:
kent$ sudo logname
[sudo] password for kent:
kent