【发布时间】:2013-10-18 20:42:20
【问题描述】:
【问题讨论】:
-
在不依赖 $USER 或调用单独的进程的情况下,到目前为止提出的方法似乎都不起作用。是否没有内置 bash 可以在不调用单独进程的情况下获取用户名?
-
当您听到命令但不确定如何使用它时,检查
man whoami通常是检查文档的良好第一站。
标签: bash
【问题讨论】:
man whoami 通常是检查文档的良好第一站。
标签: bash
在命令行输入
whoami
或
echo "$USER"
要将这些值保存到变量中,请执行以下操作
myvariable=$(whoami)
或
myvariable=$USER
当然,您不需要创建变量,因为这是 $USER 变量的用途。
【讨论】:
$USER 根本没有设置。更糟糕的是,它只是一个环境变量,因此可以被用户覆盖:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
whoami(如您所建议的那样)可以完全消除问题,假设覆盖的环境变量在您的上下文中是一个潜在问题。
whoami 的替代品是id -u -n。
id -u 将返回用户 ID(例如,0 代表 root)。
【讨论】:
id 命令和 -u 和 -n 标志是 posix 的一部分,那么这将是一个值得关注的方法
"${USER}" 和 whoami 都取决于您的登录方式。具体来说,登录 shell 和 sudo 将设置 $USER,whoami 查看附加到标准输入的用户。但是,如果您正在从 cron 运行批处理作业,或者您正在以不同于 root 的用户身份运行启动脚本,那么这些将输出错误的用户 (root) 或根本不输出任何内容。无论查看进程的用户 ID,此答案都会返回正确的值。
-n 参数打印用户名,就像最初提出的问题一样。请参阅以下内容:id -u -n 打印 brett - 甚至在 darwin 上。
使用标准的 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
【讨论】:
【讨论】:
ps 命令是显示当前 shell pid 的所有者所需的一切。
command -p id(来自 POSIX shell)或/usr/xpg4/bin/id。更一般地说,在 Solaris 上,您希望修改您的环境以将自己置于 POSIX 环境中(使用类似 PATH=getconf PATH 的内容,并确保运行 /usr/xpg4/bin/sh)以避免被 70 年代的命令卡住/ 80 年代。
两个命令:
id 将用户 ID 与组一起打印。
格式:uid=usernumber(username) ...
whoami 给出当前用户名
【讨论】:
当需要 root (sudo) 权限时,通常是 90%+ 使用脚本时,前面答案中的方法总是给你root 作为答案。
获取当前“登录”用户同样简单,但需要访问不同的变量:$SUDO_UID 和 $SUDO_USER。
它们可以被回显:
echo $SUDO_UID
echo $SUDO_USER
或赋值,例如:
myuid=$SUDO_UID
myuname=$SUDO_USER
【讨论】:
在Solaris OS 中我使用了这个命令:
$ who am i # Remember to use it with space.
在 Linux 上 - 有人已经在 cmets 中回答了这个问题。
$ whoami # Without space
【讨论】:
当前用户的用户名可以在纯 Bash 中通过${parameter@operator} 参数扩展(在 Bash 4.4 中引入)获得:
$ : \\u
$ printf '%s\n' "${_@P}"
通过设置存储在$_ 中的最后一个参数,使用内置的:(true 的同义词)代替临时变量。然后我们将其展开 (\u),就好像它是带有 P 运算符的提示字符串。
这比使用$USER 更好,因为$USER 只是一个常规环境变量;它可以被修改、取消设置等。即使它不是故意篡改的,它仍然不正确的常见情况是在没有启动登录 shell 的情况下切换用户(su 的默认值)。
【讨论】:
REALUSER="${SUDO_USER:-${USER}}"
...让您成为普通用户(如果不是 sudo)→ 或 ←普通用户在当前 sudo 调用之后。
【讨论】:
${SUDO_USER:-$USER}。或与 whoami ${SUDO_USER:-$(whoami)}.
在大多数 Linux 系统上,只需在命令行上键入 whoami 即可提供用户 ID。
但是,在 Solaris 上,您可能必须通过以下命令确定登录用户的 UID 来确定用户 ID。
echo $UID
一旦知道 UID,通过将 UID 与 /etc/passwd 文件进行匹配来找到用户。
cat /etc/passwd | cut -d":" -f1,3
【讨论】:
全部,
从我在这里看到的所有答案都是错误的,特别是如果您进入 sudo 模式,并且所有返回的都是“root”而不是登录用户。答案是使用'who'并找到eh'tty1'用户并提取它。 thw "w" 命令的作用相同,var=$SUDO_USER 获取真正的登录用户。
干杯!
TBNK
【讨论】:
这是一个简单的 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
【讨论】:
获取当前任务的user_struct
#define get_current_user() \
({ \
struct user_struct *__u; \
const struct cred *__cred; \
__cred = current_cred(); \
__u = get_uid(__cred->user); \
__u; \
})
【讨论】: