Як я можу отримати ім’я поточного користувача в Bash?


321

Я пишу програму на Bash, якій потрібно отримати ім’я користувача.

Я чув про щось, що називається whoami , але поняття не маю, що вона робить або як нею користуватися.

Яку команду використовувати для отримання поточного імені користувача?


Здається, жоден із запропонованих поки що методів не працює, не покладаючись на $ USER або не посилаючись на окремий процес. Чи немає bash вбудований, щоб отримати ім'я користувача, не викликаючи окремий процес?
ColinM

9
Коли ви чули команду, але не знаєте, як її використовувати, перевірка, man whoamiяк правило, є хорошою першою зупинкою для перевірки документації.
Марк Стосберг

Відповіді:


470

У командному рядку введіть

whoami

або

echo "$USER"

Щоб зберегти ці значення у змінній, виконайте це

myvariable=$(whoami)

або

myvariable=$USER

Звичайно, вам не потрібно робити змінну, оскільки $USERсаме для цього потрібна змінна.


53
Просто коротке зауваження, що $ USER та whoami повертають різні значення, якщо ваша команда виконує команду через ssh як інший користувач. whoami повертає користувача ОС, а US USER повертає ssh користувача.
BillMan

4
@BillMan, що це навіть означає? Чи можете ви навести приклад?
Dejay Clayton

17
У деяких випадках $USERне встановлюється взагалі. Гірше, що це просто змінна середовище, тому користувач може її перекрити:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif Що ви пропонуєте як вирішення цієї проблеми?
SethMMorton

3
@SethMMorton Я розумію, що я зробив цю проблему гірше, ніж зазвичай. Однак, щоб відповісти на питання, використання whoami(як ви запропонували) взагалі усуває проблему, якщо припустити, що змінені змінні середовища є потенційною проблемою у вашому контексті.
sitaktif

81

Альтернативою whoamiє id -u -n.

id -uповерне ідентифікатор користувача (наприклад, 0 для root ).


5
Якщо я не помиляюся, це був би шлях, якщо портативність викликає занепокоєння, оскільки idкоманда -uта -nпрапори є частиною posix

3
Це дійсно має бути прийнятою відповіддю. "${USER}"і whoamiобидва залежать від способу входу. Зокрема, оболонки та sudo для входу встановлять $ USER та whoamiдивляться на користувача, приєднаного до stdin. Однак, якщо ви виконуєте пакетне завдання з cron, або ви запускаєте скрипт запуску як інший користувач, ніж root, то вони виводять неправильного користувача (root) або взагалі нічого. Ця відповідь поверне правильне значення незалежно від перегляду ідентифікатора користувача процесу.
Асфанд Казі

Це не корисно, якщо ви хочете ім'я користувача, а не ідентифікатор
Jonathan

3
якщо ви спробували команду перед тим, як додати неправдиві коментарі, ви побачите, що -nаргумент друкує ім'я користувача, як і оригінальне запитання. дивіться наступне: id -u -nвідбитки brett- навіть на Дарвіні.
Бретт

20

Використовуйте стандартну команду Unix / Linux / BSD / MacOS lognameдля отримання користувача, який увійшов у систему. Це ігнорує навколишнє середовище, а також судо, оскільки це ненадійні репортери. Він завжди буде друкувати ім’я користувача, що увійшов, а потім вийде. Ця команда існує приблизно з 1981 року.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

Зловмисник, який я використовував у Solaris 9 і Linux, і який працює чудово для обох:

ps -o user= -p $$ | awk '{print $1}'

Цей фрагмент друкує ім’я користувача поточним EUID.

ПРИМІТКА. Тут вам потрібен Баш як перекладач.

У Solaris у вас проблеми з описаними вище методами:

  • idне приймає -uі -nпараметри (тому вам доведеться проаналізувати вихід)
  • whoami не існує (за замовчуванням)
  • who am I друкує власника поточного терміналу (ігнорує EUID)
  • $USERзмінна встановлюється правильно лише після читання файлів профілю (наприклад, /etc/profile)

1
Для чого вам потрібен баш як перекладач? Ніщо в показаному командному рядку не здається специфічним для будь-якої оболонки. Насправді, навіщо навіть включати трубу через awk? Наскільки я можу сказати, ваша psкоманда - це все, що потрібно для відображення власника підошви поточної оболонки.
ghoti

Для нас, як людей, нехтувати зайвою інформацією природно. Частина awk виділяє потрібні дані - для змінних або загалом для комп'ютера, який не може зробити припущення про льоту лише на цьому рудиментарному рівні.
BradChesney79

Для Solaris використовуйте command -p id(із оболонки POSIX) або /usr/xpg4/bin/id. Більш загально, в Solaris ви хочете змінити своє середовище, щоб поставити себе в середовище POSIX (з чимось на зразок PATH=getconf PATH` і обов'язково запустити /usr/xpg4/bin/sh), щоб не застрягти з командами з 70-х / 80-х років.
Стефан Хазелас

'ps: невідомий варіант - o'
Ананд Рокз

12

Дві команди:

  1. id друкує ідентифікатор користувача разом з групами. Формат:uid=usernumber(username) ...

  2. whoami дає поточне ім'я користувача


1
$ whoami недоступний як змінна в bash. Вам потрібно виконати або $ (whoami), або `whoami`, щоб реально виконати команду whoami!
Рудольф Майєр

@RudolfMayer Я виправив це
wjandrea

6

Коли потрібні дозволи root (sudo), що зазвичай 90% + при використанні сценаріїв, методи в попередніх відповідях завжди дають вам root відповідь.

Для отримання поточного "входу в систему" користувача так само просто, але він вимагає доступу до різних змінних: $SUDO_UIDі$SUDO_USER .

Вони можуть перегукуватися:

echo $SUDO_UID
echo $SUDO_USER

Або призначено, наприклад:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

В OS Solaris я використав цю команду:

$ who am i     # Remember to use it with space.

Про Linux - хтось уже відповів на це в коментарях.

$ whoami       # Without space

5

Для Bash , KornShell ( ksh) та shін. На багато ваших запитань швидко відповідають будь-які:

man [function]

щоб отримати документацію для системи, яку ви використовуєте, або зазвичай зручніше:

google "людина функція"

Це може дати різні результати для деяких речей, коли Linux і Unix мають незначні відмінності.

Для цього питання просто введіть "whoami" у свою оболонку.

Для його скриптування:

myvar=$(whoami)

2

Ім’я користувача поточного користувача можна отримати в чистому Bash з ${parameter@operator}розширенням параметра (введеного в Bash 4.4):

$ : \\u
$ printf '%s\n' "${_@P}"

:Вбудований (синонім true) використовується замість тимчасової змінної, встановивши останній аргумент, який зберігається в $_. Потім розгортаємо його ( \u) так, ніби це рядок підказок з Pоператором.

Це краще, ніж використовувати $USER, як$USER це просто звичайна змінна середовище; його можна змінювати, не встановлювати тощо. Навіть якщо це не навмисно підроблено, звичайний випадок, коли він все ще неправильний, - це коли користувач перемикається без запуску оболонки входу ( suза замовчуванням).


1

У більшості систем Linux просто введіть whoami в командному рядку надає ідентифікатор користувача.

Однак у Solaris вам, можливо, доведеться визначити ідентифікатор користувача, визначивши UID користувача, який увійшов через команду нижче.

echo $UID

Після того, як UID відомий, знайдіть користувача, порівнявши UID з /etc/passwdфайлом.

cat /etc/passwd | cut -d":" -f1,3

кішка / тощо / passwd | вирізати -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Ендрю Тейлор

-4

Отримайте користувача_структуру поточного завдання

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
Питання полягало у тому, як отримати ім’я користувача всередині bash-скрипту. Ця відповідь стосується того, як отримати числовий ідентифікатор користувача (а не ім'я користувача) з коду С, що працює в ядрі Linux (наприклад, з користувацького модуля ядра Linux). Це не відповідь на поставлене запитання, це відповідь на інше питання.
Саймон Кіссане
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.