Wiele systemów posiada getentkomendy do listy lub kwerendy zawartości nazwa usługi baz danych, takich jak passwd, group, services, protocols...
getent passwd | cut -d: -f6
Wyświetliłby katalogi domowe ( pole rozdzielone 6- tym dwukropkiem) wszystkich użytkowników w bazach danych, które można wyliczyć .
Sama nazwa użytkownika znajduje się w pierwszym polu, więc dla listy nazw użytkowników:
getent passwd | cut -d: -f1
(zwróć uwagę, że nie oznacza to, że ci użytkownicy mogą zalogować się do systemu lub utworzono ich katalog domowy, ale że są oni znani w systemie, mogą zostać przetłumaczeni na identyfikator użytkownika).
W przypadku baz danych, których nie można wyliczyć, możesz spróbować wysłać zapytanie do każdego możliwego identyfikatora użytkownika osobno:
getent passwd {0..65535} | cut -d: -f1,6
(tutaj przy założeniu, że UID zatrzyma się na 65535 (niektóre systemy obsługują więcej) i powłoka, która obsługuje {x..y}formę rozwijania nawiasów przez Zsh). Ale nie chcesz tego robić często w systemach, w których baza danych użytkowników jest podłączona do sieci (a lokalne buforowanie jest ograniczone), takich jak LDAP, NIS +, SQL ... ponieważ może to oznaczać duży ruch sieciowy (i obciążenie serwera katalogów ), aby wykonać wszystkie te zapytania.
Oznacza to również, że jeśli kilku użytkowników korzysta z tego samego identyfikatora użytkownika, dostaniesz tylko jeden wpis dla każdego identyfikatora użytkownika, więc przegap inne.
Jeśli nie masz getent, możesz skorzystać z perl:
perl -le 'while (@e = getpwent) {print $e[7]}'
dla getent passwd( $e[0]dla nazw użytkowników) lub:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
za getent passwd {0..65535}tymi samymi zastrzeżeniami.
W powłokach można użyć ~userkatalogu głównego user, ale w większości powłok, który działa tylko w przypadku ograniczonego zestawu nazw użytkowników (lista dozwolonych znaków w nazwach użytkowników obsługiwanych dla tego ~operatora rozszerzenia różni się w zależności od powłoki) kilka powłok (w tym bash) ~$usernie będzie działać (należy skorzystać z opcji, evalgdy nazwa użytkownika jest tam przechowywana w zmiennej). I nadal będziesz musiał znaleźć sposób na uzyskanie listy nazw użytkowników.
Niektóre powłoki mają wbudowaną obsługę pobierania tej listy nazw użytkowników.
bash: compgen -uzwraca listę użytkowników w bazach danych, które można wyliczyć.
zsh: $userdirstablica asocjacyjna odwzorowuje nazwy użytkowników na ich katalog domowy (ogranicza się również do baz danych, które można wyliczyć, ale jeśli wykonasz ~userrozszerzenie dla użytkownika znajdującego się w bazie danych, której nie można wyliczyć, pozycja zostanie dodana $userdirs). Możesz więc zrobić:
printf '%s => %s\n' "${(kv@)userdirs}"
aby wyświetlić listę użytkowników z ich katalogiem domowym.
Działa to tylko wtedy, gdy zshjest interaktywne .
tcsh, fishA yashtrzy inne pociski, które mogą zakończyć nazwy użytkownika (na przykład przy wypełnianiu ~<Tab>argumentów), ale nie wygląda na to, że pozwalają uzyskać tę listę nazw użytkowników programowo.