Molti sistemi hanno un getent
comando per elenco o interrogare il contenuto delle Name Service database come passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Sarebbe elencare le home directory (il 6 ° campo delimitato colon) di tutti gli utenti nel database che possono essere enumerati .
Il nome utente stesso si trova nel primo campo, quindi per l'elenco dei nomi utente:
getent passwd | cut -d: -f1
(notare che ciò non significa che quegli utenti possano accedere al sistema o che la loro home directory sia stata creata, ma che sono noti al sistema, possono essere tradotti in un ID utente).
Per i database che non possono essere enumerati, puoi provare e interrogare ogni possibile ID utente singolarmente:
getent passwd {0..65535} | cut -d: -f1,6
(qui supponendo che gli uids si fermino a 65535 (alcuni sistemi supportano di più) e una shell che supporta la {x..y}
forma di espansione brace di zsh ). Ma non vorrai farlo spesso su sistemi in cui il database degli utenti è collegato in rete (e la memorizzazione nella cache locale è limitata) come LDAP, NIS +, SQL ... poiché ciò potrebbe implicare molto traffico di rete (e caricare sul server di directory ) per fare tutte quelle domande.
Ciò significa anche che se ci sono più utenti che condividono lo stesso UID, otterrai solo una voce per ciascun UID, quindi perdi gli altri.
Se non lo hai getent
, puoi ricorrere a perl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
per getent passwd
( $e[0]
per i nomi utente) o:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
per getent passwd {0..65535}
con gli stessi avvertimenti.
Nelle shell, è possibile utilizzare ~user
per ottenere la home directory di user
, ma nella maggior parte delle shell, che funziona solo per un set limitato di nomi utente (l'elenco dei caratteri consentiti nei nomi utente supportati per quell'operatore di ~
espansione varia da shell a shell) e con diverse shell (incluso bash
), ~$user
non funzioneranno (dovresti ricorrere a eval
quando il nome dell'utente è memorizzato in una variabile lì). E dovresti ancora trovare un modo per ottenere l'elenco dei nomi utente.
Alcune shell hanno il supporto integrato per ottenere quell'elenco di nomi utente.
bash
: compgen -u
restituisce l'elenco degli utenti nei database che possono essere enumerati.
zsh
: l' $userdirs
array associativo associa i nomi utente alla loro home directory (limitata anche ai database che possono essere enumerati, ma se si esegue ~user
un'espansione per un utente che si trova in un database non enumerabile, verrà aggiunta una voce $userdirs
). Quindi puoi fare:
printf '%s => %s\n' "${(kv@)userdirs}"
per elencare gli utenti con la loro home directory.
Funziona solo quando zsh
è interattivo però .
tcsh
, fish
E yash
sono altri tre coperture che possono completare i nomi utente (ad esempio quando il completamento ~<Tab>
argomenti), ma non sembra ci hanno permesso di ottenere quella lista di nomi utente a livello di codice.