Идентифицировать пользователя в сценарии 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
3

who am i | awk '{print $1}'не работал на меня, но who|awk '{print $1}'будет служить работе

Шринивас
источник
1
Не на хосте, где есть сеанс более одного пользователя
Роман Граждан
1

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

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

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

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

Роб

Роб
источник
0

Если вы ищете именно тот UID (полезно для докеров), то это работает:

LOCAL_USER_ID=$(id -u $(logname))
Джим Ханзикер
источник