Câu trả lời:
Dựa trên gid
, người dùng hệ thống và người dùng dịch vụ có thể được tách rời như sau,
/etc/passwd
chứa danh sách cho tất cả người dùng cùng với một số thông tin khác. Người dùng dịch vụ hoặc người dùng thực có gid
lớn hơn hoặc bằng 1000. Vì vậy, một danh sách người dùng thực có thể được lấy là,
awk -F: '($3>=1000)&&($1!="nobody"){print $1}' /etc/passwd
Ngoài ra, một danh sách người dùng hệ thống ( gid
<1000) có thể được trích xuất dưới dạng,
awk -F: '($3<1000){print $1}' /etc/passwd
Làm thế nào nó hoạt động
Nội dung của /etc/passwd
là như thế nào,
root:x:0:0:root:/root:/bin/bash
...
souravc:x:1001:1001:Souravc:/home/souravc:/bin/bash
Khi sử dụng awk
với -F:
nó, phân chia nội dung của một dòng thành nhiều trường được coi :
là dấu tách trường. Trường đầu tiên chứa tên người dùng và trường thứ ba cógid
.
Do đó để trích xuất người dùng thực, awk
chỉ cần kiểm tra giá trị của trường thứ ba lớn hơn bằng 1000 và không phải là không có người dùng và in trường đầu tiên, tức là tên người dùng.
Để liệt kê tất cả người dùng hệ thống, chỉ cần kiểm tra gid
ít hơn 1000 và in tên người dùng.
Biên tập
Như bạn muốn liệt kê root
(gid = 0) trong danh sách người dùng thực. Nhận người dùng thực sự như,
awk -F: '($3==0)||($3>=1000)&&($1!="nobody"){print $1}' /etc/passwd
Nhận người dùng hệ thống như,
awk -F: '($3<1000)&&($1!="root"){print $1}' /etc/passwd
Lưu ý tôi luôn bỏ qua nobody
người dùng.
Để liệt kê cục bộ (người dùng hệ thống) hơn có thể đăng nhập và có homedir và GID dưới 1000
cat /etc/passwd | cut -d: -f 1,3,6 | grep "[1-9][0-9][0-9][0-9]" | grep "/home" | cut -d: -f1
Để liệt kê tất cả người dùng khác: (chủ yếu là người dùng hệ thống và có GID dưới 1000):
cat /etc/passwd | cut -d: -f 1,3,6 | grep -v "[1-9][0-9][0-9][0-9]" | cut -d: -f1