Quiero un comando para enumerar todos los usuarios que tienen privilegios de root, es decir, sudo?
Supongamos que soy un usuario sudoer. ¿Cómo podría conocer a todos los demás usuarios de sudoer?
Quiero un comando para enumerar todos los usuarios que tienen privilegios de root, es decir, sudo?
Supongamos que soy un usuario sudoer. ¿Cómo podría conocer a todos los demás usuarios de sudoer?
Respuestas:
Si solo necesita enumerar los sudoers enumerados en el sudo
grupo, creo que la mejor manera de hacerlo sería ejecutar este comando (que debería ser computacionalmente más ligero que cualquiera de los otros comandos en esta respuesta):
grep -Po '^sudo.+:\K.*$' /etc/group
Además, como se sugiere en los comentarios de muru, el formato de las entradas /etc/group
puede ser manejado fácilmente por cut
:
grep '^sudo:.*$' /etc/group | cut -d: -f4
También de nuevo como se sugiere en los comentarios de muru, uno puede usar getent
en lugar de grep
:
getent group sudo | cut -d: -f4
Cualquiera de estos comandos imprimirá a todos los usuarios enumerados en el sudo
grupo /etc/group
(si corresponde).
Desglose del comando n. ° 1:
grep
: Imprime todas las líneas que coinciden con una expresión regular en un archivo-P
: hace grep
coincidir las expresiones regulares de estilo Perlo
: hace grep
imprimir solo la cadena coincidente'^sudo.+:\K.*$'
: hace grep
coincidir la expresión regular entre las comillasDesglose de la expresión regular n. ° 1:
^
: inicio de línea.+
: uno o más personajes\K
: descartar el partido anterior.*
: cero o más caracteres$
: fin de la líneaDesglose del comando n. ° 2:
grep
: Imprime todas las líneas que coinciden con una expresión regular en un archivo'^sudo.+:\K.*$'
: hace grep
coincidir la expresión regular entre las comillascut
: Imprime solo una sección específica de cada línea en un archivo-d:
: hace cut
interpretar :
como un delimitador de campo-f4
: hace que la cut
impresión sea solo el cuarto campoDesglose de Regex # 2:
^
: inicio de línea.*
: cero o más caracteres$
: fin de la líneagetent group sudo | cut -d: -f4
, o use awk, pero recuerde que group y passwd tienen formatos fijos, con delimitadores.
getent group
: no necesita el grep en absoluto. getent group foo
es como grep foo /etc/group
, pero más capaz.
getent
nada, ¿alguna idea sobre cómo grep
y cómo getent
comparar computacionalmente? ¿Sería más ligero correr getent
?
sudo
grupo. Algunos unixes tienen otros grupos como wheel
. La respuesta de @muru incluirá a todos los sudoers sin importar en qué grupos se encuentren.
Como se indica aquí , considero la forma más sencilla de descubrir con -l
& -U
opciones juntas, solo tipee una users
lista, por ejemplo: John
luego:
Si el usuario tiene sudo
acceso, imprimirá el nivel de sudo
acceso para ese usuario en particular:
sudo -l -U John
User John may run the following commands on this host:
(ALL : ALL) ALL
Si el usuario no tiene acceso a sudo, se imprimirá que un usuario no puede ejecutar sudo
en localhost:
sudo -l -U John
User John is not allowed to run sudo on localhost.
"%domain admins@mycompany.intra" ALL=(ALL) ALL
funciona. Me ahorró mucho tiempo, porque no sabía que esto también funciona para usuarios no locales.
Como ya se ha dicho, la respuesta se puede encontrar en Unix & Linux Stack Exchange :
Esto muestra que el usuario "saml" es un miembro del grupo de ruedas.
$ getent group wheel wheel:x:10:saml
La única diferencia es que el grupo en Ubuntu no es wheel
, pero sudo
(o admin
en versiones anteriores de Ubuntu). Entonces el comando se convierte en:
getent group sudo
geten group
y veo muchos números diferentes. Mi pregunta original es cómo averiguar si un usuario es un usuario del sistema (creado con useradd -r
)
Ampliando la sudo -l -U
prueba, se puede usar getent passwd
para determinar los usuarios que pueden usar sudo
. El uso getent
nos permite acceder a usuarios que pueden no estar presentes en el passwd
archivo, como los usuarios LDAP:
getent passwd | cut -f1 -d: | sudo xargs -L1 sudo -l -U | grep -v 'not allowed'
sudo -U
no devuelve un valor de salida distinto de cero que podríamos aprovechar, por lo que estamos reducidos a grep la salida.
sudo
.
En la mayoría de los sistemas tipo Unix, que tienen el comando sudo y tienen un archivo de configuración sudo; ejecutando visudo como root:
:~$ sudo bash
o
:~$ su
:~# visudo
permitirá que un administrador inspeccione y modifique los privilegios de los grupos que pueden usar el comando sudo.
En los sistemas tipo Unix basados en Debian, como Ubuntu, los grupos 4 y 27 generalmente tienen derechos de acceso a los privilegios de sudo.
El grupo 4 es el grupo administrador (adm) y el grupo 27 es el sudo gid.
Para ver qué usuarios están asignados actualmente a estos grupos, busque el archivo / etc / group como se muestra a continuación:
:~$ cat /etc/group
Una salida de muestra, en Ubuntu (pero no en sistemas basados en Redhat, Oracle Solaris / Solaris o BSD) produciría esto:
adm:x:4:youruser
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:youruser,mybrother
floppy:x:25:
tape:x:26:
sudo:x:27:youruser,mybrother
Como podemos ver, su usuario es el administrador del sistema y miembro del grupo 4 (adm). Pero su usuario y mi hermano son miembros del grupo 27, que es el número gid (identificación del grupo) del sudo del grupo. Entonces mybrother también puede obtener privilegios de root (superusuario).
Muchos sistemas Linux como Fedora y Slackware incorporan el grupo de ruedas gid = 10. Lo que permite privilegios de administrador cuando se aplica el comando sudo. En sistemas basados en BSD (por ejemplo, FreeBSD), el usuario raíz es un miembro del grupo de rueda que es gid 0.
Además, mediante el comando id, cualquier usuario puede encontrar la información del grupo de otro usuario conocido en el sistema.
Por ejemplo:
:~$ id mybrother
Salida de muestra
uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
Este comando devuelve una lista de usuarios con derechos de sudo:
awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' /etc/passwd
La salida es (por ejemplo):
<username> : <username> adm cdrom sudo dip plugdev lpadmin sambashare docker
Si solo se muestra el nombre de usuario, este comando:
awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
Mando:
cat /etc/group | grep sudo
Salida:
sudo:x:27:Tom,Stacy
Tom, Stacy son los usuarios con privilegios de sudo.
cat
.
Yo estaba confundido acerca de cómo el vagrant
usuario puede utilizar sudo
incluso sin ser mencionado en /etc/sudoers
ni en /etc/group
ni encontrado con getent
.
Resulta que sudo
también lee entradas de todos los archivos en/etc/sudoers.d/
. Entonces, si no ha examinado ese directorio, es posible que no se dé cuenta de cuántos usuarios realmente tienen sudo
acceso.
Este tipo de sudo
acceso puede ser detectado por la respuesta de JoKeR usando, sudo -l -U vagrant
pero no es detectado por ninguna de las otras respuestas aquí, en las que todos se basan getent
o /etc/group
.