2009-05-07 27 views

Trả lời

40

Bạn không chỉ định ngôn ngữ lập trình, vì vậy tôi giả sử bạn muốn sử dụng trình bao; đây là câu trả lời cho vỏ Posix.

Hai bước này: lấy hồ sơ thích hợp, sau đó lấy trường bạn muốn từ bản ghi đó.

Thứ nhất, việc các bản ghi tài khoản được thực hiện bằng truy vấn passwd bảng:

$ user_name=foo 
$ user_record="$(getent passwd $user_name)" 
$ echo "$user_record" 
foo:x:1023:1025:Fred Nurk,,,:/home/foo:/bin/bash 

Đối với nho khô cuồng loạn, tên đầy đủ của người dùng sẽ được ghi lại trong một lĩnh vực được gọi là “GECOS” field; để làm phức tạp vấn đề, trường này thường có cấu trúc riêng với tên đầy đủ là chỉ là một trong một số trường con tùy chọn. Vì vậy, bất cứ điều gì muốn lấy tên đầy đủ từ hồ sơ tài khoản cần phải phân tích cả hai cấp độ này.

$ 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 

ngôn ngữ lập trình của bạn có thể có một chức năng thư viện để làm điều này trong các bước ít hơn. Trong C, bạn sẽ sử dụng hàm 'getpwnam' và sau đó phân tích cú pháp trường GECOS.

+3

nho khô kích động? – dat

+1

@dat, xem http://catb.org/jargon/html/H/hysterical-reasons.html – bignose

+2

Đã không hiệu quả đối với tôi. Nhưng điều này đã làm: 'getent passwd | grep "$ USER" | cắt -d ":" -f5 | cut -d "," -f1' –

20

Trên một hệ thống glibc hiện đại, sử dụng lệnh này:

getent passwd "username" | cut -d ':' -f 5 

Điều đó sẽ giúp bạn có được sự xâm nhập passwd của người sử dụng chỉ định, không phụ thuộc vào mô-đun NSS tiềm ẩn.

Đọc số manpage of getent.


Nếu bạn đã lập trình, bạn có thể sử dụng getpwnam() C-Function:

struct passwd *getpwnam(const char *name); 

Các passwd struct có thành viên pw_gecos mà phải ghi rõ họ tên của người dùng.

Đọc số manpage of getpwnam().


Lưu ý rằng nhiều hệ thống sử dụng trường này nhiều hơn tên đầy đủ của người dùng. Quy ước phổ biến nhất là sử dụng dấu phẩy (,) làm dấu phân tách trong trường và đặt tên thật của người dùng trước.

8

Chỉ trong trường hợp bạn muốn làm điều này từ C, hãy thử một cái gì đó như thế này:

#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: %s\n", argv[i], strerror(errno)); 
     else if (ret == 0) 
      printf("UNKONWN: %s\n", argv[i]); 
     else 
      printf("%s: %s\n", argv[i], fullname); 
    } 
    return 0; 
} 
6

Hãy thử điều này:

getent passwd eutl420 | awk -F':' '{gsub(",", "",$5); print $5}' 
2

Mã của tôi làm việc trong bash và ksh, nhưng không phải dash hay cũ Bourne shell. Nó cũng đọc các trường khác, trong trường hợp bạn có thể muốn chúng.

IFS=: read user x uid gid gecos hm sh < <(getent passwd $USER) 
name=${gecos%%,*} 
echo "$name" 

Bạn cũng có thể quét toàn bộ tệp/etc/passwd. Điều này làm việc trong shell Bourne đơn giản, trong quá trình 1, nhưng không quá nhiều với LDAP hoặc cái gì.

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 

Mặt khác, sử dụng các công cụ là tốt. Và C cũng tốt.

-2

Ưu điểm cũ ngón tay cũng có thể giúp :-)

finger $USER |head -n1 |cut -d : -f3 
+1

OP đã đề cập đến ngón tay chưa được cài đặt ít nhất một năm trước khi yo đã đăng câu trả lời này;) –

5

Hai câu trả lời trên có thể được kết hợp trong một dòng:

getent passwd <username> | cut -d ':' -f 5 | cut -d ',' -f 1 
7

Sự kết hợp của câu trả lời khác, thử nghiệm trên tối thiểu Debian/Cài đặt Ubuntu:

getent passwd `whoami` | cut -d ':' -f 5 | cut -d ',' -f 1 
-1

Take 1:

$ user_name=sshd 
$ awk -F: "\$1 == \"$user_name\" { print \$5 }" /etc/passwd 
Secure Shell Daemon 

Tuy nhiên, cơ sở dữ liệu passwd hỗ trợ nhân vật đặc biệt '&' trong gecos, mà nên thay thế bằng giá trị vốn hóa của tên người dùng:

$ user_name=operator 
$ awk -F: "\$1 == \"$user_name\" { print \$5 }" /etc/passwd 
System & 

Hầu hết các câu trả lời ở đây (trừ các giải pháp ngón tay) không tôn trọng &. Nếu bạn muốn hỗ trợ trường hợp này, bạn sẽ cần một tập lệnh phức tạp hơn.

Take 2:

$ user_name=operator 
$ awk -F: "\$1 == \"$user_name\" { u=\$1; sub(/./, toupper(substr(u,1,1)), u); 
    gsub(/&/, u, \$5); print \$5 }" /etc/passwd 
System Operator 
0

Cách mà tôi đã tìm nó trên Linux để có được tên đầy đủ vào một biến là:

u_id=`id -u` 
uname=`awk -F: -vid=$u_id '{if ($3 == id) print $5}' /etc/passwd` 

sử dụng Sau đó chỉ cần đơn giản biến, ví dụ: $ echo $uname

Các vấn đề liên quan