Идентифицировать пользователя в сценарии Bash, вызываемом sudo


108

Если я создам сценарий, /root/bin/whoami.shсодержащий:

#!/bin/bash
whoami

и этот сценарий вызывается пользователем с правильно настроенным sudo, он укажет

root

Есть ли быстрый способ получить фактического пользователя в сценарии, или мне придется прибегать к параметрам, передаваемым через это имя пользователя?

Ответы:


134

$ SUDO_USER не работает, если вы используете sudo su -.
Также требуется несколько проверок - если $USER == 'root'то получится $SUDO_USER.

Вместо команды whoamiиспользуйте who am i. Это запускает whoкоманду, отфильтрованную для текущего сеанса. Он дает вам больше информации, чем вам нужно. Итак, сделайте это, чтобы получить только пользователя:

who am i | awk '{print $1}'

В качестве альтернативы (и проще) вы можете использовать logname. Он делает то же самое, что и в приведенном выше заявлении.

Это дает вам имя пользователя, вошедшего в сеанс.

Они работают независимо от sudoили sudo su [whatever]. Он также работает независимо от того, сколько раз suи sudoвызывается.


2
Да, +1, who am iвот ответ.
Джо Кирни

43
Альтернатива who am iесть who mom likes. Твой выбор.
wchargin

3
whoвозвращает мне две строки, обе содержат мое имя, и не who am iвозвращает ни одной. Любая помощь?
Хош Садик

7
Я использую Ubuntu 16.04, и команда who am iничего не делает, вроде бы просто who, так что who | awk '{print $1}'работает как положено;)
daveoncode

1
На всякий случай, если вы не awkустановили, вы также можете использовать cut: who mom likes | cut -d' ' -f1 или sedпо какой-то причине: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Измир Рамирес,

56

Я думаю, что $ SUDO_USER действителен.

#!/bin/bash
echo $SUDO_USER
whoami

1
Странная вещь: sudo envпоказывает, SUDO_USERно sudo echo $SUDO_USERничего не печатает ...
Job

17
работа, это не странно, это ожидаемо. in sudo echo $SUDO_USER, bash оценивает $ SUDO_USER перед выполнением sudo. попробуйте сценарий, опубликованный в этом решении, он работает.

@quadmore: Если вы довольны ответом, не забудьте принять его.
Иов

2
Вы также можете использовать, echo ${SUDO_USER:-$USER}чтобы поймать и то, sudoи другое, а не sudo. Но ответ logname
Эвана

2
@TobiasKienzler - И, как указывает Эван, $SUDO_USERне работает sudo su -, но lognameвсегда работает.
Дэвид Харкнесс

13

Вот как получить имя пользователя человека, который вызвал скрипт, независимо от того, sudo или нет:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

или более короткая версия

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`

8
еще короче: user=${SUDO_USER:-$(whoami)}илиuser=$(logname)
Тобиас Кинцлер 06



1

Используя whoami, who am i, who, idили $SUDO_USERэто не так.

На самом деле, whoэто никогда не решение вопроса, так как он будет перечислять только зарегистрированных пользователей, которых могут быть десятки ...

На мой взгляд, единственный ценный ответ - это использование logname.

Надеюсь это поможет

Роб


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