Wiele systemów posiada getent
komendy 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ć ~user
katalogu 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
) ~$user
nie będzie działać (należy skorzystać z opcji, eval
gdy 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 -u
zwraca listę użytkowników w bazach danych, które można wyliczyć.
zsh
: $userdirs
tablica 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 ~user
rozszerzenie 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 zsh
jest interaktywne .
tcsh
, fish
A yash
trzy 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.