Как получить имя пользователя, который выполнил скрипт bash, как sudo?


17

Я хочу создать bash-скрипт, который должен выполняться с помощью sudo, но должен учитывать имя пользователя не-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

почему не редактировать? исправлено сейчас.
Марсио

Это слишком тривиально, изменения должны содержать не менее 6 символов, по крайней мере, рекомендуемых.
nyuszika7h

хорошо я понял. Спасибо за советы: я обычно ставлю такой хэш-банг #!/usr/bin/env bashв мои скрипты bash.
Марсио

Хэш-банг игнорируется, если вы вызываете его явно с помощью shили как-то еще.
nyuszika7h

Ответы:


28

Я не уверен, насколько он стандартен, но, по крайней мере, в системах Ubuntu sudoустанавливаются следующие переменные среды (среди прочего - см. ENVIRONMENTРаздел справочной страницы sudo):

   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. Благодарность!
Марсио

Подтвердили работу на Mac.
SiKing

Работает и на Ubuntu.
Энди Джей

9

Если вы хотите, чтобы это работало без этого sudo, используйте ${SUDO_USER:-$USER}. Например:

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

объяснение

${var:-val}будет расширяться до $var, если он не установлен или пуст, в этом случае он будет расширяться до val.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.