Визначте користувача в сценарії 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повертає 2 рядки для мене, обидва містять моє ім’я, і не who am iповертають жодного. Будь-яка допомога?
Hosh Sadiq

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нічого не друкує ...
Іов

17
робота, це не дивно, це очікується. в sudo echo $SUDO_USER, bash оцінює $ SUDO_USER перед виконанням sudo. спробуйте скрипт, розміщений у цьому рішенні, він працює.

@quadmore: Якщо ви задоволені відповіддю, не забудьте прийняти її.
робота

2
Ви також можете використовувати echo ${SUDO_USER:-$USER}ловити як sudoбіг, так і не-судо. Але відповідь logname
Евана

2
@TobiasKienzler - І як зазначає Еван, $SUDO_USERне працює sudo su -, але lognameзавжди працює.
Девід Харкнесс

13

Ось як отримати ім’я користувача особи, яка зателефонувала до сценарію, незалежно від того, судо чи ні:

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)
Тобіас Кіенцлер



1

Використовуючи whoami, who am i, who, idабо $SUDO_USERце не так.

Насправді, whoце ніколи не є вирішенням питання, оскільки він лише перелічить зареєстрованих користувачів, яких може бути десятки ...

На моїх очах, єдина цінна відповідь - використання logname.

Сподіваюся, це допомагає

Роб


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.