【问题标题】:How can I get the current user's username in Bash?如何在 Bash 中获取当前用户的用户名?
【发布时间】:2013-10-18 20:42:20
【问题描述】:

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

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

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

【问题讨论】:

  • 在不依赖 $USER 或调用单独的进程的情况下,到目前为止提出的方法似乎都不起作用。是否没有内置 bash 可以在不调用单独进程的情况下获取用户名?
  • 当您听到命令但不确定如何使用它时,检查man whoami 通常是检查文档的良好第一站。

标签: bash


【解决方案1】:

在命令行输入

whoami

echo "$USER"

要将这些值保存到变量中,请执行以下操作

myvariable=$(whoami)

myvariable=$USER

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

【讨论】:

  • 请注意,如果您以另一个用户身份通过​​ ssh 运行命令,则 $USER 和 whoami 返回不同的值。 whoami 返回操作系统用户,$USER 返回 ssh 用户。
  • @BillMan,这是什么意思?你能举个例子吗?
  • 在某些情况下,$USER 根本没有设置。更糟糕的是,它只是一个环境变量,因此可以被用户覆盖:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
  • @sitaktif 你对这个问题有什么建议?
  • @SethMMorton 我意识到我让这个问题听起来比平时更糟。不过,要回答这个问题,使用whoami(如您所建议的那样)可以完全消除问题,假设覆盖的环境变量在您的上下文中是一个潜在问题。
【解决方案2】:

whoami 的替代品是id -u -n

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

【讨论】:

  • 除非我弄错了,否则如果 id 命令和 -u-n 标志是 posix 的一部分,那么这将是一个值得关注的方法
  • 这确实应该是公认的答案。 "${USER}"whoami 都取决于您的登录方式。具体来说,登录 shell 和 sudo 将设置 $USER,whoami 查看附加到标准输入的用户。但是,如果您正在从 cron 运行批处理作业,或者您正在以不同于 root 的用户身份运行启动脚本,那么这些将输出错误的用户 (root) 或根本不输出任何内容。无论查看进程的用户 ID,此答案都会返回正确的值。
  • 如果您在添加不真实的 cmets 之前尝试了该命令,您会看到 -n 参数打印用户名,就像最初提出的问题一样。请参阅以下内容:id -u -n 打印 brett - 甚至在 darwin 上。
【解决方案3】:

使用标准的 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

【讨论】:

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

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

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

此 sn-p 打印具有当前 EUID 的用户的名称。

注意:这里需要 Bash 作为解释器。

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

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

【讨论】:

  • 为什么需要 bash 作为解释器?显示的命令行中的任何内容似乎都不是特定于任何 shell 的。事实上,为什么还要通过 awk 包含管道?据我所知,您的 ps 命令是显示当前 shell pid 的所有者所需的一切。
  • 对于我们人类来说,忽略多余的信息是很自然的。 awk 部分隔离了所需的数据——对于变量,或者一般来说,在这个基本级别还不能进行动态假设的计算机。
  • 在 Solaris 上,使用command -p id(来自 POSIX shell)或/usr/xpg4/bin/id。更一般地说,在 Solaris 上,您希望修改您的环境以将自己置于 POSIX 环境中(使用类似 PATH=getconf PATH 的内容,并确保运行 /usr/xpg4/bin/sh)以避免被 70 年代的命令卡住/ 80 年代。
  • 'ps: 未知选项 -- o'
【解决方案5】:

两个命令:

  1. id 将用户 ID 与组一起打印。 格式:uid=usernumber(username) ...

  2. whoami 给出当前用户名

【讨论】:

  • $whoami 在 bash 中不能作为 变量 使用。您需要执行 $(whoami) 或 `whoami` 来实际执行 whoami 命令!
  • @RudolfMayer 我修好了
【解决方案6】:

当需要 root (sudo) 权限时,通常是 90%+ 使用脚本时,前面答案中的方法总是给你root 作为答案。

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

它们可以被回显:

echo $SUDO_UID
echo $SUDO_USER

或赋值,例如:

myuid=$SUDO_UID
myuname=$SUDO_USER

【讨论】:

    【解决方案7】:

    Solaris OS 中我使用了这个命令:

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

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

    $ whoami       # Without space
    

    【讨论】:

    • 这 2 个命令显示 2 个不同的信息。只需以 root 身份登录,使用“su - xxx”,然后自己查看。
    【解决方案8】:

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

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

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

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

    【讨论】:

      【解决方案9】:

      对于BashKornShell (ksh)、sh 等。您的许多问题都可以通过以下任一方式快速回答:

      man [function]
      

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

      谷歌“人功能”

      这可能会在 Linux 和 Unix 有适度差异的情况下给出不同的结果。

      对于这个问题,只需在你的 shell 中输入“whoami”即可。

      编写脚本:

      myvar=$(whoami)
      

      【讨论】:

        【解决方案10】:
        REALUSER="${SUDO_USER:-${USER}}"
        

        ...让您成为普通用户(如果不是 sudo)→ 或 ←普通用户在当前 sudo 调用之后

        【讨论】:

        • 不需要内部的大括号对 -> ${SUDO_USER:-$USER}。或与 whoami ${SUDO_USER:-$(whoami)}.
        【解决方案11】:

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

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

        echo $UID
        

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

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

        【讨论】:

        • 猫 /etc/passwd |剪切-d":" -f1,3 | grep $UID |剪切 -d":" -f1
        【解决方案12】:

        全部,

        从我在这里看到的所有答案都是错误的,特别是如果您进入 sudo 模式,并且所有返回的都是“root”而不是登录用户。答案是使用'who'并找到eh'tty1'用户并提取它。 thw "w" 命令的作用相同,var=$SUDO_USER 获取真正的登录用户。

        干杯!

        TBNK

        【讨论】:

        【解决方案13】:

        这是一个简单的 bash 脚本示例,用于将我的代码推送到我的个人 gitlab,它会在我的提交消息中显示我当前的用户名。

        # !/bin/sh
        # This example script is for pushing my code to gitlab 
        echo Starting Push for user :  $(whoami), Please enter Commit Message 
        below: 
        read varMessage  
        # this prompts the user for an input messsage , then saves the result in 
        # a variable 
        git add . 
        git commit -m "$(whoami): $varMessage" 
        git push -u "url_of_project" master
        

        我个人 gitlab 中的结果提交消息如下所示:-

        walexia : updated Matplotib example
        

        【讨论】:

          【解决方案14】:

          获取当前任务的user_struct

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

          【讨论】:

          • 问题是关于如何在 bash 脚本中获取用户名。这个答案是关于如何从 Linux 内核中运行的 C 代码(例如从自定义 Linux 内核模块)中获取数字用户 ID(而不是用户名)。这不是对所提出问题的回答,而是对不同问题的回答。
          猜你喜欢
          • 2014-08-21
          • 1970-01-01
          • 2018-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-06
          相关资源
          最近更新 更多