Nhiều hệ thống có một getent
lệnh vào danh sách hoặc truy vấn nội dung của Service Name cơ sở dữ liệu như passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Sẽ liệt kê các thư mục nhà ( trường phân cách dấu hai chấm thứ 6 ) của tất cả người dùng trong cơ sở dữ liệu có thể được liệt kê .
Tên người dùng nằm trong trường đầu tiên, vì vậy đối với danh sách tên người dùng:
getent passwd | cut -d: -f1
(lưu ý rằng điều đó không có nghĩa là những người dùng đó có thể đăng nhập vào hệ thống hoặc thư mục chính của họ đã được tạo, nhưng họ đã biết hệ thống, họ có thể được dịch sang id người dùng).
Đối với cơ sở dữ liệu không thể liệt kê, bạn có thể thử và truy vấn từng id người dùng có thể:
getent passwd {0..65535} | cut -d: -f1,6
(ở đây giả sử uids dừng ở 65535 (một số hệ thống hỗ trợ nhiều hơn) và hệ vỏ hỗ trợ {x..y}
hình thức mở rộng niềng răng của zsh ). Nhưng bạn sẽ không muốn làm điều đó thường xuyên trên các hệ thống mà cơ sở dữ liệu người dùng được nối mạng (và có bộ nhớ đệm cục bộ hạn chế) như LDAP, NIS +, SQL ... vì điều đó có thể ám chỉ rất nhiều lưu lượng mạng (và tải trên máy chủ thư mục ) để thực hiện tất cả các truy vấn đó.
Điều đó cũng có nghĩa là nếu có một vài người dùng chia sẻ cùng một uid, bạn sẽ chỉ nhận được một mục nhập cho mỗi uid, vì vậy hãy bỏ lỡ những người khác.
Nếu bạn không có getent
, bạn có thể dùng đến perl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
cho getent passwd
( $e[0]
cho tên người dùng) hoặc:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
cho getent passwd {0..65535}
cùng hãy cẩn thận.
Trong shell, bạn có thể sử dụng ~user
để lấy thư mục chính của user
, nhưng trong hầu hết các shell, chỉ hoạt động với một nhóm tên người dùng giới hạn (danh sách các ký tự được phép trong tên người dùng được hỗ trợ cho ~
toán tử mở rộng khác nhau từ shell sang shell) và với một số shell (bao gồm bash
), ~$user
sẽ không hoạt động (bạn cần phải sử dụng eval
khi tên của người dùng được lưu trữ trong một biến ở đó). Và bạn vẫn phải tìm cách lấy danh sách tên người dùng.
Một số shell có hỗ trợ dựng sẵn để có được danh sách tên người dùng đó.
bash
: compgen -u
sẽ trả về danh sách người dùng trong cơ sở dữ liệu có thể được liệt kê.
zsh
: $userdirs
mảng kết hợp ánh xạ tên người dùng vào thư mục chính của họ (cũng giới hạn ở cơ sở dữ liệu có thể được liệt kê, nhưng nếu bạn ~user
mở rộng cho người dùng trong cơ sở dữ liệu không thể đếm được, một mục nhập sẽ được thêm vào $userdirs
). Vì vậy, bạn có thể làm:
printf '%s => %s\n' "${(kv@)userdirs}"
để liệt kê người dùng với thư mục nhà của họ.
Điều đó chỉ hoạt động khi zsh
được tương tác mặc dù .
tcsh
, fish
Và yash
ba vỏ khác có thể hoàn thành tên người dùng (ví dụ khi hoàn thành ~<Tab>
luận), nhưng nó không giống như họ để cho bạn có được rằng danh sách các tên người dùng lập trình.