Muchos sistemas tienen un getent
comando a la lista o consultar el contenido de los Servicio de nombres de bases de datos como passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Sería una lista de los directorios de inicio (la 6 ª campo delimitado por dos puntos) de todos los usuarios de bases de datos que pueden ser enumerados .
El nombre de usuario en sí está en el primer campo, por lo que para la lista de nombres de usuario:
getent passwd | cut -d: -f1
(tenga en cuenta que no significa que esos usuarios puedan iniciar sesión en el sistema o que se haya creado su directorio de inicio, pero que el sistema los conoce, pueden traducirse a una identificación de usuario).
Para las bases de datos que no se pueden enumerar, puede intentar consultar cada ID de usuario posible individualmente:
getent passwd {0..65535} | cut -d: -f1,6
(aquí suponiendo que los uids se detengan en 65535 (algunos sistemas admiten más) y un shell que admite la {x..y}
forma de expansión de llaves de zsh ). Pero no querrá hacer eso a menudo en sistemas donde la base de datos de usuarios está en red (y hay un almacenamiento en caché local limitado) como LDAP, NIS +, SQL ... ya que eso podría implicar mucho tráfico de red (y cargar en el servidor de directorio) ) para hacer todas esas consultas.
Eso también significa que si hay varios usuarios que comparten el mismo uid, solo obtendrás una entrada para cada uid, así que echa de menos los demás.
Si no tiene getent
, puede recurrir a perl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
para getent passwd
( $e[0]
para los nombres de usuario) o:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
para getent passwd {0..65535}
con las mismas advertencias.
En shells, puede usar ~user
para obtener el directorio de inicio de user
, pero en la mayoría de los shells, eso solo funciona para un conjunto limitado de nombres de usuario (la lista de caracteres permitidos en los nombres de usuario admitidos para ese ~
operador de expansión varía de un shell a otro) y con varias conchas (incluidas bash
),~$user
no funcionarán (necesitaría recurrir eval
cuando el nombre del usuario se almacena en una variable allí). Y aún tendría que encontrar una manera de obtener la lista de nombres de usuario.
Algunos shells tienen soporte incorporado para obtener esa lista de nombres de usuario.
bash
: compgen -u
devolvería la lista de usuarios en bases de datos que se pueden enumerar.
zsh
: la $userdirs
matriz asociativa asigna los nombres de usuario a su directorio de inicio (también limitado a las bases de datos que se pueden enumerar, pero si realiza una ~user
expansión para un usuario que se encuentra en una base de datos no enumerable, se agregará una entrada $userdirs
). Entonces puedes hacer:
printf '%s => %s\n' "${(kv@)userdirs}"
para enumerar usuarios con su directorio de inicio.
Sin zsh
embargo, eso solo funciona cuando es interactivo .
tcsh
, fish
y yash
son otros tres shells que pueden completar nombres de usuario (por ejemplo, al completar ~<Tab>
argumentos), pero no parece que le permitan obtener esa lista de nombres de usuario mediante programación.