在bash中获取当前用户的用户名?

Geo*_*rge 281 bash username

我正在用bash编写一个程序,需要获取用户的用户名.

我听说过一个叫做的东西,whoami但我不知道它做了什么或如何使用它.

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

Set*_*ton 407

在命令行输入

echo "$USER"
Run Code Online (Sandbox Code Playgroud)

要么

whoami
Run Code Online (Sandbox Code Playgroud)

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

myvariable=$(whoami)
Run Code Online (Sandbox Code Playgroud)

要么

myvariable=$USER
Run Code Online (Sandbox Code Playgroud)

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

  • 只需快速注意,如果您通过ssh作为另一个用户运行命令,则$ USER和whoami会返回不同的值.whoami返回OS用户,$ USER返回ssh用户. (48认同)
  • 在某些情况下,`$ USER`根本没有设置.更糟糕的是,它只是一个环境变量,因此它可以被用户覆盖:`USER = thisisnotmyname bash -c'echo $ USER'#打印thisisnotmyname` (15认同)
  • @BillMan,这甚至意味着什么?你能提供一个例子吗? (4认同)
  • @SethMMorton我意识到我让这个问题听起来比平常更糟糕.但是,回答这个问题,使用`whoami`(正如你的建议)完全消除了这个问题,假设被覆盖的环境变量在你的上下文中是一个潜在的问题. (3认同)
  • “当前用户名”有点含糊。在 sudo 下运行时你想得到什么?“echo $USER”生成我登录的名称,无论是否在 sudo 下运行,而“whoami”在 sudo 下运行时返回“root”,否则返回我的实际登录名。需要以 sudo 身份运行的脚本更有可能出现在少数需要您的登录名而不是“root”的脚本中。 (3认同)

Bre*_*ett 76

替代whoamiid -u -n.

id -u 将返回用户ID(例如0表示root).

  • 除非我弄错了,如果可移植性是一个问题,这将是一个方法,因为`id`命令和`-u`和`-n`标志是[posix]的一部分(http://pubs.opengroup.组织/ onlinepubs/9699919799 /公共事业/ id.html#tag_20_59) (5认同)
  • 这确实应该是公认的答案。“ $ {USER}”和“ whoami”都取决于您的登录方式。具体地说,登录外壳和sudo将设置$ USER,而“ whoami”则查看附加到stdin的用户。但是,如果您从cron运行批处理作业,或者以不同于root的用户身份运行启动脚本,则这些脚本将输出错误的用户(root)或完全不输出。无论通过查看进程的用户ID,此答案都将返回正确的值。 (3认同)
  • 如果您在添加不真实的注释之前尝试过该命令,您会看到“-n”参数打印用户名,就像最初提出的问题一样。请参阅以下内容:“id -u -n”打印“brett” - 即使在达尔文上也是如此。 (3认同)

小智 17

我在Solaris 9和Linux上使用的hack,它适用于它们:

ps -o user= -p $$ | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

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

注意:你需要bash作为翻译.

在Solaris上,您遇到方法问题,如上所述:

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


Dev*_*n R 17

使用标准的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
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说比 whoami 或 $USER 特别有帮助,因为我使用 sudo 作为另一个用户执行,但希望原始用户而不是 sudo 用户。 (2认同)
  • 顺便说一句,这是最好的答案,不仅对我个人而言,而且对OP问题的目的也是如此。 (2认同)

Sir*_*dda 11

两个命令:

  1. id 打印用户ID和组.格式:uid=usernumber(username) ...

  2. whoami 给出当前用户名


Fra*_*cke 7

REALUSER="${SUDO_USER:-${USER}}"\n
Run Code Online (Sandbox Code Playgroud)\n

...让您获得常规用户(如果非 sudo)\xe2\x86\x92 或 \xe2\x86\x90当前 sudo 调用背后的常规用户。

\n

  • 内部一对大括号不是必需的 -> `${SUDO_USER:-$USER}`。或者使用 whoami `${SUDO_USER:-$(whoami)}`。 (2认同)

小智 6

当需要root(sudo)权限时,使用脚本时通常为90%+,上述方法总是为您root提供答案.

获取当前"登录"用户同样简单,但需要访问不同的变量:$SUDO_UID$SUDO_USER.

他们可以回应:

echo $SUDO_UID
echo $SUDO_USER
Run Code Online (Sandbox Code Playgroud)

或指定,例如:

myuid=$SUDO_UID
myuname=$SUDO_USER
Run Code Online (Sandbox Code Playgroud)


Fre*_*ell 5

为了bash/ksh/sh等你的许多问题将很快被要么回答说:

man [function]
Run Code Online (Sandbox Code Playgroud)

获取您正在使用的系统的文档.

或者通常更方便:google"man function"这可能会给linux和unix有些差异的东西带来不同的结果.

对于这个问题,只需在shell中输入"whoami"即可.

编写脚本:

myvar=$(whoami)


小智 5

在Solaris OS中 - 我使用了此命令.

$ who am i     # remember to use it with space.
Run Code Online (Sandbox Code Playgroud)

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

$ whoami       # without space
Run Code Online (Sandbox Code Playgroud)


小智 5

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

$ : \\u
$ printf '%s\n' "${_@P}"
Run Code Online (Sandbox Code Playgroud)

通过设置最后一个参数(存储在 中),使用内置变量:( 的同义词)代替临时变量。然后我们将其展开 ( ),就好像它是带有运算符的提示字符串一样。true$_\uP

这比使用 更好$USER,因为$USER它只是一个常规环境变量;它可以被修改、取消设置等。即使它不是故意篡改的,它仍然不正确的常见情况是在没有启动登录 shell 的情况下切换用户(su默认情况下)。