Как получить действительное имя пользователя в Unix? - PullRequest
10 голосов
/ 08 июля 2011

Я ищу, чтобы узнать реального пользователя (полное имя) вошедшего в систему пользователя, чтобы не запрашивать его в приложении, которое я создаю. Я вижу, что команда finger выведет столбчатый список данных, который включает это, и мне было интересно, имеет ли смысл анализировать это или есть более простой способ? Ни один из переключателей для пальца, который я нашел, не выводит только настоящее имя. Любые мысли будут высоко ценится.

Ответы [ 7 ]

13 голосов
/ 07 января 2014
getent passwd `whoami` | cut -d : -f 5

(getent обычно предпочтительнее, чем grepping /etc/passwd).

3 голосов
/ 12 июля 2011

Вы можете использовать getpwent () , чтобы получить каждую последующую запись пароля, пока не найдете тот, который соответствует текущему зарегистрированному пользователю, а затем проанализировать поле gecos .

Лучше, вы можете использовать getpwuid () , чтобы напрямую получить запись для uid текущего пользователя.

В любом случае,

  1. У вас естьсначала получить логин или идентификатор текущего пользователя и
  2. . Нет никаких гарантий, что поле gecos содержит реальное полное имя пользователя или что-либо еще.
2 голосов
/ 07 февраля 2016
getent passwd "$USER" | cut -d: -f5 | cut -d, -f1

Сначала извлекается строка текущего пользователя из базы данных passwd (которая также может храниться в NIS или LDAP )

Визвлеченная строка, поля разделяются : разделителями.Запись GECOS является 5-м полем, поэтому первая cut извлекает это.

Сама запись GECOS , возможно, состоит из нескольких элементов - разделенных , - полное имя которого является первым.Вот что извлекает второй cut.Это также работает, если в записи GECOS отсутствуют запятые.В этом случае вся запись является первым элементом.

Вы также можете присвоить результат переменной:

fullname=$( getent passwd "$USER" | cut -d: -f5 | cut -d, -f1 )

или обработать ее напрямую напрямую:

echo "$( getent passwd "$USER" | cut -d: -f5 | cut -d, -f1 )'s home is $HOME."
cat <<EOF
Hello, $( getent passwd "$USER" | cut -d: -f5 | cut -d, -f1 ).
How are you doing?
EOF
1 голос
/ 25 сентября 2016

Для macOS нет команды getent; вместо этого вы должны использовать id -F

0 голосов
/ 12 сентября 2018

Для macOS и Linux:

if [ "Darwin" = $(uname) ]; then FULLNAME=$(id -P $USER | awk -F '[:]' '{print $8}') else FULLNAME=$(getent passwd $USER | cut -d: -f5 | cut -d, -f1) fi echo $FULLNAME

0 голосов
/ 26 сентября 2012

Я использую

grep "^$USER:" /etc/passwd | awk -F: '{print $5}'

Пояснения:

  • $ USER содержит логин текущего пользователя
  • Первая часть (grep) извлекает из /etc/passwd строку об этом пользователе
  • Вторая часть (awk) разбивает эту строку с разделителем ':' и печатает 5-й компонент, полное имя

Если вы не хотите полагаться на установленную $USER, вы можете использовать это вместо:

grep "^`whoami`:" /etc/passwd | awk -F: '{print $5}'
0 голосов
/ 12 июля 2011

Как насчет попытки Whoami или логин

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...