какой самый простой способ получить полное имя пользователя в системе linux/posix?

<p>я мог бы поискать в/etc/passwd, но это кажется обременительным. 'finger' не установлен, и я бы хотел избежать этой зависимости. это для программы, поэтому было бы хорошо, если бы была какая-то команда, которая позволяла бы вам просто получить доступ к пользовательской информации.</p>

<p>вы не указываете язык программирования, поэтому я предполагаю, что вы хотите использовать shell; вот <strong>ответ для оболочек posix</strong>.</p><p>два шага к этому: получить соответствующую запись, затем получить нужное поле из этой записи.</p><p>во-первых, получение записи об учетной записи выполняется с помощью <strong>запроса таблицы <code>passwd</code></strong>:</p><pre><code>$ user_name=foo $ user\_record="$(getent passwd $user\_name)" $ echo "$user\_record" foo:x:1023:1025:fred nurk,,,:/home/foo:/bin/bash </code></pre><p>для истерического изюма полное имя пользователя записывается в поле, называемом <strong> <a href="http://en.wikipedia.org/wiki/gecos\_field">поле «gecos»</a> </strong>; чтобы усложнить задачу, это поле часто имеет свою собственную структуру с полным именем <strong>как одно из нескольких необязательных подполей</strong>. поэтому все, что хочет получить полное имя из записи учетной записи, должно анализировать оба этих уровня.</p><pre><code>$ user_record="$(getent passwd $user_name)" $ user\_gecos\_field="$(echo "$user\_record" | cut -d ':' -f 5)" $ user_full_name="$(echo "$user_gecos_field" | cut -d ',' -f 1)" $ echo "$user_full_name" fred nurk ваш <strong>язык программирования, вероятно, имеет библиотечную функцию</strong>, которая делает это за меньшее количество шагов. в c вы будете использовать функцию getpwnam, а затем анализировать поле gecos.

в современной системе glibc используйте эту команду:getent passwd "username" | cut -d ':' -f 5 это даст вам запись passwd указанного пользователя, независимую от базового модуля nss.прочитайте <a href="http://unixhelp.ed.ac.uk/cgi/man-cgi?getent">справочную страницу getent .если вы уже программируете, вы можете использовать c-функцию getpwnam():struct passwd getpwnam(const char name); структура passwd имеет член pw_gecos, который должен содержать полное имя пользователя.прочитайте <a href="http://linux.die.net/man/3/getpwnam">справочную страницу getpwnam() .имейте в виду, что многие системы используют это поле не только для полного имени пользователя. наиболее распространенным соглашением является использование запятой (,) в качестве разделителя внутри поля и сначала ставить реальное имя пользователя.

на всякий случай, если вы хотите сделать это из c, попробуйте что-то вроде этого:#include <sys/types.h> #include <pwd.h> #include <errno.h> #include <stdio.h> #include <string.h> / get full name of a user, given their username. return 0 for not found, -1 for error, or 1 for success. copy name to fullname, but only up to max-1 chars (max includes trailing '0'). note that if the gecos field contains commas, only up to to (but not including) the first comma is copied, since the commas are a convention to add more than just the name into the field, e.g., room number, phone number, etc. / static int getfullname(const char username, char fullname, size_t max) { struct passwd p; size_t n; errno = 0; p = getpwnam(username); if (p == null && errno == 0) return 0; if (p == null) return -1; if (max == 0) return 1; n = strcspn(p->pw_gecos, ","); if (n > max - 1) n = max - 1; memcpy(fullname, p->pw_gecos, n); fullname[n] = '0'; return 1; } int main(int argc, char argv) { int i; int ret; char fullname[1024]; for (i = 1; i < argc; ++i) { ret = getfullname(argv[i], fullname, sizeof fullname); if (ret == -1) printf("error: %s: %sn", argv[i], strerror(errno)); else if (ret == 0) printf("unkonwn: %sn", argv[i]); else printf("%s: %sn", argv[i], fullname); } return 0; } 

сочетание других ответов, протестированных на минимальных установках debian/ubuntu:getent passwd whoami | cut -d ':' -f 5 | cut -d ',' -f 1 

попробуй это:getent passwd eutl420 | awk -f':' '{gsub(",", "",$5); print $5}' 

два верхних ответа можно объединить в одну строку:getent passwd <username> | cut -d ':' -f 5 | cut -d ',' -f 1 

мой код работает в bash и ksh, но не в dash или старой bourne shell. он также читает другие поля, на случай, если вы захотите их.ifs=: read user x uid gid gecos hm sh < <( getent passwd $user ) name=${gecos%%,} echo "$name" </code></pre><p>вы также можете сканировать весь файл/etc/passwd. это работает в простой bourne shell, в 1 процессе, но не так сильно с ldap или чем-то еще.</p><pre><code>while ifs=: read user x uid gid gecos hm sh; do name=${gecos%%,} [ $uid -ge 1000 -a $uid -lt 60000 ] && echo "$name" done < /etc/passwd </code></pre><p>с другой стороны, использование инструментов это хорошо. и с тоже хорошо.</p>

<p>в linux я понял, как получить полное имя переменной:</p><pre><code>u\_id=`id -u` uname=`awk -f: -vid=$u_id '{if ($3 == id) print $5}' /etc/passwd тогда просто используйте переменную, например: $ echo $uname</code></p>