Як отримати ім’я користувача, який виконав сценарій bash як sudo?


17

Я хочу створити 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

чому б не редагувати? виправлено зараз.
marcio

Це занадто банально, редагувань має бути не менше 6 символів, принаймні запропонованих.
nyuszika7h

добре, я зрозумів. Дякую за поради: DI зазвичай ставить такий хешбанг #!/usr/bin/env bashу моїх баш-скриптах.
marcio

Хешбанг ігнорується, якщо ви явно викликаєте його 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. Спасибі!
marcio

Підтверджено роботу на 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.