如何获取以sudo执行bash脚本的用户名?


17

我想创建一个必须使用sudo执行的bash脚本,但应考虑执行它的非sudo用户的名称。因此,如果用户bob运行,sudo ./myscript.sh我想myscript.sh知道bob是执行它的那个人。

让我们看看里面myscript.sh

USER=$(whoami)
# Do something that takes into account the username.

我怎么知道产生该过程的用户名?更具体地讲,我应该怎么用的,而不是whoami来获得bob,而不是root


我认为这不是有效的脚本USER=$(whoami)。请注意,USER已经作为外壳内部变量存在。另外,如果它是bash脚本,请不要使用来运行它sh,因为仅有POSIX兼容功能集。
nyuszika7h 2014年

为什么不编辑?现在修复。
marcio

太琐碎了,编辑内容必须至少包含6个字符,至少应包含建议的字符。
nyuszika7h 2014年

好的,我明白了。感谢您的提示:DI通常#!/usr/bin/env bash在我的bash脚本上放置一个像这样的hashbang 。
marcio

如果用sh或其他方式显式调用hashbang,则会将其忽略。
nyuszika7h 2014年

Answers:


28

我不确定它的标准性如何,但是至少在Ubuntu系统中sudo设置了以下环境变量(以及其他-请参见ENVIRONMENTsudo联机帮助页的部分):

   SUDO_UID        Set to the user ID of the user who invoked sudo

   SUDO_USER       Set to the login of the user who invoked sudo

例如,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver

在我测试过的所有平台上都能正常工作:debian,fedora(redhat)和freebsd。谢谢!
marcio

确认在Mac上可以使用。
斯金

也可以在ubuntu上使用。
安迪·杰伊

9

如果您希望它也能正常工作sudo,请使用${SUDO_USER:-$USER}。例如:

printf '%s\n' "${SUDO_USER:-$USER}"

说明

${var:-val}将扩大到$var,除非它是未设置或为空,在这种情况下,将扩大到val

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.