De nombreux systèmes ont une getent
commande à la liste ou interroger le contenu des services Nom des bases de données comme passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Répertorierait les répertoires personnels (le champ délimité par le 6 e colon) de tous les utilisateurs des bases de données qui peuvent être énumérés .
Le nom d'utilisateur lui-même est dans le premier champ, donc pour la liste des noms d'utilisateurs:
getent passwd | cut -d: -f1
(notez que cela ne signifie pas que ces utilisateurs peuvent se connecter au système ou que leur répertoire personnel a été créé, mais qu'ils sont connus du système, ils peuvent être traduits en un ID utilisateur).
Pour les bases de données qui ne peuvent pas être énumérées, vous pouvez essayer et interroger chaque identifiant utilisateur possible individuellement:
getent passwd {0..65535} | cut -d: -f1,6
(ici en supposant que les uids s'arrêtent à 65535 (certains systèmes prennent en charge plus) et un shell qui prend en charge la {x..y}
forme d'expansion d'accolade de zsh ). Mais vous ne voudriez pas le faire souvent sur des systèmes où la base de données utilisateur est en réseau (et la mise en cache locale est limitée) comme LDAP, NIS +, SQL ... car cela pourrait impliquer beaucoup de trafic réseau (et charger sur le serveur d'annuaire) ) pour effectuer toutes ces requêtes.
Cela signifie également que si plusieurs utilisateurs partagent le même uid, vous n'aurez qu'une seule entrée pour chaque uid, alors manquez les autres.
Si vous n'en avez pas getent
, vous pouvez recourir à perl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
pour getent passwd
( $e[0]
pour les noms d'utilisateur), ou:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
pour getent passwd {0..65535}
les mêmes mises en garde.
Dans les shells, vous pouvez utiliser ~user
pour obtenir le répertoire personnel de user
, mais dans la plupart des shells, cela ne fonctionne que pour un ensemble limité de noms d'utilisateurs (la liste des caractères autorisés dans les noms d'utilisateurs pris en charge pour cet ~
opérateur d'expansion varie d'un shell à l'autre) et avec plusieurs shells (y compris bash
), ~$user
ne fonctionneront pas (vous devrez y recourir eval
lorsque le nom de l'utilisateur est stocké dans une variable là-bas). Et il vous faudrait encore trouver un moyen d'obtenir la liste des noms d'utilisateurs.
Certains shells ont un support intégré pour obtenir cette liste de noms d'utilisateurs.
bash
: compgen -u
retournerait la liste des utilisateurs dans les bases de données qui peuvent être énumérées.
zsh
: le $userdirs
tableau associatif mappe les noms d'utilisateurs à leur répertoire personnel (également limité aux bases de données qui peuvent être énumérées, mais si vous effectuez une ~user
expansion pour un utilisateur qui se trouve dans une base de données non énumérable, une entrée sera ajoutée à $userdirs
). Vous pouvez donc faire:
printf '%s => %s\n' "${(kv@)userdirs}"
pour répertorier les utilisateurs avec leur répertoire personnel.
Cela ne fonctionne que quand il zsh
est interactif .
tcsh
, fish
Et yash
trois autres coquilles qui peuvent compléter les noms d'utilisateur (par exemple lors de l' achèvement des ~<Tab>
arguments), mais il ne semble pas qu'ils vous permettent d' obtenir cette liste des noms d'utilisateur par programme.