如何在Bash中获取当前用户的用户名?


321

我正在Bash中编写一个程序,该程序需要获取用户的用户名。

我听说过一种叫做的东西whoami,但是我不知道它的作用或用法。

我使用什么命令来获取当前的用户名?


到目前为止,似乎所有建议的方法都不能依靠$ USER或调用一个单独的进程来工作。是否有内置的bash无需调用单独的进程即可获取用户名?
ColinM

9
当您听到命令但不确定如何使用它时,检查man whoami通常是检查文档的一个很好的第一站。
Mark Stosberg '17

Answers:


470

在命令行上,输入

whoami

要么

echo "$USER"

要将这些值保存到变量,请执行

myvariable=$(whoami)

要么

myvariable=$USER

当然,您不需要创建变量,因为这就是$USER变量的用途。


53
请注意,如果您以另一个用户的身份通过ssh运行命令,则$ USER和whoami将返回不同的值。whoami返回操作系统用户,$ USER返回ssh用户。
BillMan

4
@BillMan,那甚至意味着什么?你能举个例子吗?
Dejay Clayton

17
在某些情况下,$USER根本没有设置。更糟糕的是,它只是一个环境变量,因此用户可以覆盖它:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif 2015年

1
@sitaktif您对解决此问题有何建议?
SethMMorton 2015年

3
@SethMMorton我知道我使这个问题听起来比平时更糟。但是,要回答这个问题,使用whoami(按照您的建议)可以完全消除问题,前提是假定覆盖的环境变量是您上下文中的潜在问题。
sitaktif

81

的替代品whoamiid -u -n

id -u将返回用户ID(例如root的 0 )。


5
除非我没有弄错,否则如果要考虑可移植性,因为这是id命令-u-n标记是posix

3
这确实应该是公认的答案。"${USER}"whoami都取决于你如何登录。具体来说,登录shell和须藤将设置$ USER,并whoami在连接到标准输入用户期待。但是,如果您从cron运行批处理作业,或者以不同于root的用户身份运行启动脚本,则这些脚本将输出错误的用户(root)或完全不输出。无论通过查看进程的用户ID,此答案都将返回正确的值。
阿斯凡德·卡兹

如果您想要用户名而不是ID,这将没有用
Jonathan

3
如果您在添加不真实的注释之前尝试了该命令,您将看到该-n参数将打印用户名,就像询问的原始问题一样。请参阅以下内容:id -u -n印刷品brett-甚至在达尔文上。
Brett

20

使用标准的Unix / Linux / BSD / MacOS命令logname检索登录的用户。这忽略了环境以及sudo,因为它们是不可靠的报告程序。它将始终打印登录用户的名称,然后退出。该命令自1981年左右就出现了。

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

我在Solaris 9和Linux 上使用过的一种技巧,对两者都适用:

ps -o user= -p $$ | awk '{print $1}'

此代码段显示具有当前EUID的用户名。

注意:您需要Bash作为此处的解释器。

在Solaris上,上述方法存在问题:

  • id不接受-u-n参数(因此您必须解析输出)
  • whoami 不存在(默认情况下)
  • who am I 打印当前终端的所有者(忽略EUID)
  • $USER仅在读取配置文件(例如/etc/profile)后才能正确设置变量

1
为什么需要bash作为口译员?所示命令行中的任何内容似乎都不是特定于任何Shell的。实际上,为什么还要通过awk包含管道?据我所知,您的ps命令是显示当前shell的pid所有者所需的所有命令。
ghoti 2014年

对于我们人类而言,无视多余的信息是很自然的。awk部分隔离所需的数据-对于变量,或者一般而言,在此基本级别上尚无法即时进行假设的计算机。
BradChesney79 2015年

在Solaris上,使用command -p id(从POSIX shell)或/usr/xpg4/bin/id。更一般而言,在Solaris上,您希望修改环境以将自己置于POSIX环境中(使用诸如PATH=getconf PATH`之类的东西,并确保运行/usr/xpg4/bin/sh)以避免被70年代/ 80年代的命令所困扰。
Stephane Chazelas

'PS:未知选项- O'
阿南德Rockzz

12

两个命令:

  1. id 显示用户ID和组。格式:uid=usernumber(username) ...

  2. whoami 给出当前的用户名


1
$ whoami 在bash中不能作为变量使用。您需要执行$(whoami)或`whoami`才能实际执行whoami命令!
Rudolf Mayer

@RudolfMayer我修复了它
wjandrea

6

如果需要root(sudo)权限(使用脚本时通常为90%以上),则先前答案中的方法始终会为您提供 root提供答案。

要获得当前的“登录”用户很简单,但是需要访问不同的变量:$SUDO_UID$SUDO_USER

它们可以得到回应:

echo $SUDO_UID
echo $SUDO_USER

或分配,例如:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

Solaris OS中,我使用了以下命令:

$ who am i     # Remember to use it with space.

在Linux上-有人已经在评论中回答了这个问题。

$ whoami       # Without space

5

对于BashKornShellkshsh等。您可以通过以下任意一种快速回答您的许多问题:

man [function]

获取您正在使用的系统或通常更方便的系统的文档:

谷歌“人功能”

对于某些Linux和Unix差异不大的情况,这可能会得出不同的结果。

对于这个问题,只需在外壳中输入“ whoami”。

编写脚本:

myvar=$(whoami)

2

当前用户的用户名可以通过${parameter@operator}参数扩展(在Bash 4.4中引入)在纯Bash中获得:

$ : \\u
$ printf '%s\n' "${_@P}"

:内置(同义词的true)是通过设置的最后一个参数,其被存储在用于代替临时变量$_。然后,将其扩展为(\u),就好像它是P运算符的提示字符串一样。

这比使用更好$USER,因为$USER这只是常规的环境变量。可以对其进行修改,取消设置等。即使不加以故意篡改,它仍然不正确的常见情况是在不启动登录Shell su的情况下切换了用户(默认设置)。


1

大多数 Linux系统上,只需在命令行上键入whoami即可提供用户ID。

但是,在Solaris上,您可能必须通过确定通过以下命令登录的用户的UID来确定用户ID。

echo $UID

知道UID后,通过将UID与/etc/passwd文件进行匹配来找到用户。

cat /etc/passwd | cut -d":" -f1,3

-4

获取当前任务的user_struct

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
问题是关于如何在bash脚本中获取用户名。这个答案是关于如何从Linux内核内部运行的C代码(例如从定制Linux内核模块)获取数字用户ID(而非用户名)的。这不是对所提问题的答案,而是对其他问题的答案。
西蒙·基萨内
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.