Tôi có thể grep qua/etc/passwd nhưng điều đó có vẻ khó chịu. 'ngón tay' không được cài đặt và tôi muốn tránh sự phụ thuộc đó. Điều này là dành cho một chương trình vì vậy nó sẽ được tốt đẹp nếu có một số lệnh cho phép bạn chỉ cần truy cập thông tin người dùng.Cách dễ nhất để lấy tên đầy đủ của người dùng trên hệ thống Linux/POSIX là gì?
Trả lời
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.
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.
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;
}
Hãy thử điều này:
getent passwd eutl420 | awk -F':' '{gsub(",", "",$5); print $5}'
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.
Ưu điểm cũ ngón tay cũng có thể giúp :-)
finger $USER |head -n1 |cut -d : -f3
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;) –
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
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
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
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
- 1. Cách lấy tên đầy đủ?
- 2. Lấy tên đầy đủ của waveIn device
- 3. lấy tên đầy đủ của một assembly
- 4. Dạng đầy đủ của "SPI" trong hệ thống chuyển đổi loại Spring 3 là gì?
- 5. Hệ thống kiểu thống nhất là gì?
- 6. Cách thanh lịch nhất để xử lý tên miền tùy chỉnh của người dùng là gì?
- 7. Cách lấy hệ thống phân cấp vai trò đầy đủ trong Symfony
- 8. Cách tốt nhất để lấy SID của người dùng hiện tại là gì?
- 9. Cách dễ nhất để đồng bộ hóa trạng thái của mô hình đường trục trên người dùng là gì? Node.js
- 10. cách an toàn nhất để lấy Hệ thống lái
- 11. Làm thế nào tôi có thể nhận được tên (hoặc tên đầy đủ) của người dùng điện thoại?
- 12. Cách hiệu quả nhất để tạo hệ thống bóng đèn diễn đàn (chưa đọc) là gì?
- 13. Làm cách nào để chuyển hướng người dùng bằng cách sử dụng Apache Rewrite, đến tên miền đầy đủ?
- 14. Cách tốt nhất để đưa một hệ thống dịch thuật vào trang web php là gì?
- 15. Cách lấy URL đầy đủ của trang Drupal?
- 16. Cách lấy tên người dùng bằng PID trên Mac OS?
- 17. Có hệ thống lưới CSS hỗ trợ chiều rộng đầy đủ không?
- 18. JavaScript - Cách lấy tên của người dùng hiện tại
- 19. Thực tiễn tốt nhất để thiết kế vai trò người dùng và hệ thống quyền?
- 20. Cách tốt nhất để lưu trữ quyền của người dùng là gì?
- 21. Cách lấy đường dẫn đầy đủ của StreamWriter
- 22. Cách tìm tên ĐẦY ĐỦ của phương thức gọi C#
- 23. Cách nhanh hơn để tìm hiểu xem người dùng có tồn tại trên hệ thống không?
- 24. Lấy tên thiết bị âm thanh đầy đủ từ Windows
- 25. Truy vấn tên đầy đủ ở Django
- 26. Cách thích hợp để triển khai hệ thống đăng nhập người dùng
- 27. Cách tốt nhất để giải quyết tên người dùng hiển thị bằng SID là gì?
- 28. Lấy tên tháng đầy đủ bằng tiếng Anh
- 29. Nhận tên đầy đủ của CPU mà không cần WMI
- 30. MVC3 + Cách lấy tên người dùng hiện tại đã đăng nhập của người dùng
nho khô kích động? – dat
@dat, xem http://catb.org/jargon/html/H/hysterical-reasons.html – bignose
Đã 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' –