Как я могу получить имя пользователя текущего пользователя в Bash?


321

Я пишу программу на Bash, которая должна получить имя пользователя пользователя.

Я слышал о том, что называется whoami, но я понятия не имею, что он делает или как его использовать.

Какую команду я использую, чтобы получить текущее имя пользователя?


Похоже, что ни один из предложенных методов не работает без использования $ USER или отдельного процесса. Нет ли встроенной команды bash для получения имени пользователя без вызова отдельного процесса?
ColinM

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

Ответы:


470

В командной строке введите

whoami

или

echo "$USER"

Чтобы сохранить эти значения в переменной, выполните

myvariable=$(whoami)

или

myvariable=$USER

Конечно, вам не нужно создавать переменную, так как для этого и нужна $USERпеременная.


53
Просто заметьте, что $ USER и whoami возвращают разные значения, если вы запускаете команду через ssh от имени другого пользователя. whoami возвращает пользователя ОС, а $ USER возвращает пользователя ssh.
BillMan

4
@BillMan, что это вообще значит? Не могли бы вы привести пример?
Деджей Клейтон

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), либо вообще ничего. Этот ответ вернет правильное значение независимо от того, смотрит ли идентификатор пользователя процесса.
Асфанд Кази

Это бесполезно, если вы хотите, чтобы имя пользователя, а не идентификатор
Джонатан

3
если вы попробуете команду перед добавлением неверных комментариев, вы увидите, что -nаргумент выводит имя пользователя, так же как и заданный исходный вопрос. смотрите следующее: id -u -nотпечатки brett- даже на дарвине.
Бретт

20

Используйте стандартную команду Unix / Linux / BSD / MacOS, lognameчтобы получить зарегистрированного пользователя. Это игнорирует как окружение, так и sudo, так как это ненадежные репортеры. Он всегда будет печатать имя пользователя, вошедшего в систему, и затем выходить. Эта команда существует примерно с 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.

ПРИМЕЧАНИЕ: вам нужен Bash в качестве переводчика.

В Solaris у вас есть проблемы с методами, описанными выше:

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

1
Зачем вам Bash в качестве переводчика? Ничто в показанной командной строке не относится к какой-либо оболочке. На самом деле зачем вообще включать трубу через awk? Насколько я могу судить, ваша psкоманда - это все, что нужно для отображения владельца pid текущей оболочки.
Готи

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

В Solaris используйте command -p id(из оболочки POSIX) или /usr/xpg4/bin/id. В более общем случае в Solaris вы захотите изменить свою среду, чтобы поместить себя в среду POSIX (с чем-то вроде PATH=getconf PATH` и обязательно запустите ее /usr/xpg4/bin/sh), чтобы избежать застревания с командами 70-х / 80-х годов.
Стефан Шазелас

'ps: неизвестный вариант - o'
Anand Rockzz

12

Две команды:

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

  2. whoami дает текущее имя пользователя


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

@RudolfMayer Я исправил это
wjandrea

6

Когда требуются права суперпользователя (sudo), что обычно составляет более 90% при использовании сценариев, методы из предыдущих ответов всегда дают вам rootответ.

Получить текущего «залогиненного» пользователя так же просто, но требуется доступ к различным переменным: $SUDO_UIDи $SUDO_USER.

Они могут быть отражены:

echo $SUDO_UID
echo $SUDO_USER

Или назначен, например:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

В ОС Solaris я использовал эту команду:

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

На Linux - кто-то уже ответил на это в комментариях.

$ whoami       # Without space

5

Для Bash , KornShell ( ksh) shи т. Д. На многие ваши вопросы быстро отвечают:

man [function]

чтобы получить документацию для системы, которую вы используете или обычно более удобно:

Google "Man Function"

Это может дать разные результаты для некоторых вещей, где 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

кошка / etc / passwd | cut -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Эндрю Тейлор

-4

Получить текущую задачу user_struct

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

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