Voglio un comando per elencare tutti gli utenti che hanno i privilegi di root, ad esempio sudo?
Supponiamo che io sia un utente sudoer. Come potrei conoscere tutti gli altri utenti sudoer?
Voglio un comando per elencare tutti gli utenti che hanno i privilegi di root, ad esempio sudo?
Supponiamo che io sia un utente sudoer. Come potrei conoscere tutti gli altri utenti sudoer?
Risposte:
Se hai solo bisogno di elencare i sudoer elencati nel sudo
gruppo, penso che il modo migliore per farlo sarebbe quello di eseguire questo comando (che dovrebbe essere computazionalmente più leggero di qualsiasi altro comando in questa risposta):
grep -Po '^sudo.+:\K.*$' /etc/group
Inoltre, come suggerito nei commenti di Muru, il formato delle voci in /etc/group
può essere facilmente gestito da cut
:
grep '^sudo:.*$' /etc/group | cut -d: -f4
Inoltre, come suggerito nei commenti di Muru, si può usare getent
al posto di grep
:
getent group sudo | cut -d: -f4
Uno di questi comandi stamperà tutti gli utenti elencati nel sudo
gruppo /etc/group
(se presenti).
Ripartizione comando n. 1:
grep
: Stampa tutte le righe corrispondenti a una regex in un file-P
: crea grep
regex in stile Perlo
: consente di grep
stampare solo la stringa corrispondente'^sudo.+:\K.*$'
: fa grep
corrispondere la regex tra le virgoletteRipartizione Regex n. 1:
^
: inizio della riga.+
: uno o più personaggi\K
: scarta la partita precedente.*
: zero o più caratteri$
: fine lineaRipartizione comando n. 2:
grep
: Stampa tutte le righe corrispondenti a una regex in un file'^sudo.+:\K.*$'
: fa grep
corrispondere la regex tra le virgolettecut
: Stampa solo una sezione specificata di ogni riga in un file-d:
: fa cut
interpretare :
come delimitatore di campo-f4
: consente di cut
stampare solo il quarto campoRipartizione Regex # 2:
^
: inizio della riga.*
: zero o più caratteri$
: fine lineagetent group sudo | cut -d: -f4
oppure usa awk, ma ricorda comunque che gruppo e passwd hanno formati fissi, con delimitatori.
getent group
- non hai bisogno del grep. getent group foo
è come grep foo /etc/group
, ma più capace.
getent
affatto, qualche idea su come grep
e getent
confrontare a livello computazionale? Sarebbe più leggero correre getent
?
sudo
gruppo. Alcuni unix hanno altri gruppi come wheel
. La risposta di @muru includerà tutti i sudoer, indipendentemente dai gruppi in cui si trovano.
Come indicato qui, considero il modo più semplice di scoprire con -l
& -U
options insieme, basta digitare users
che elencherà ad esempio John
:
Se l'utente ha sudo
accesso, stamperà il livello di sudo
accesso per quel particolare utente:
sudo -l -U John
User John may run the following commands on this host:
(ALL : ALL) ALL
Se l'utente non ha accesso sudo, stamperà che un utente non può essere eseguito sudo
su localhost:
sudo -l -U John
User John is not allowed to run sudo on localhost.
for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done
. hack rapido niente garantito :)
"%domain admins@mycompany.intra" ALL=(ALL) ALL
allora funziona. Mi hai risparmiato un sacco di tempo, perché non ero a conoscenza del fatto che funziona anche per utenti non locali.
Come è già stato affermato, la risposta può essere trovata su Unix & Linux Stack Exchange :
Ciò dimostra che l'utente "saml" è un membro del gruppo ruote.
$ getent group wheel wheel:x:10:saml
L'unica differenza è che il gruppo in Ubuntu non lo è wheel
, ma sudo
(o admin
nelle versioni precedenti di Ubuntu). Quindi il comando diventa:
getent group sudo
geten group
e vedo molti numeri diversi. La mia domanda originale è: come scoprire se un utente è un utente di sistema (creato con useradd -r
)
Espandendo il sudo -l -U
test, è possibile utilizzare getent passwd
per determinare gli utenti che possono utilizzare sudo
. L' getent
utilizzo ci consente di accedere agli utenti che potrebbero non essere presenti nel passwd
file, come gli utenti LDAP:
getent passwd | cut -f1 -d: | sudo xargs -L1 sudo -l -U | grep -v 'not allowed'
sudo -U
non restituisce un valore di uscita diverso da zero che potremmo trarre vantaggio, quindi siamo ridotti a grepping dell'output.
sudo
.
Sulla maggior parte dei sistemi simili a Unix, che hanno il comando sudo e hanno un file di configurazione sudo; eseguendo visudo come root:
:~$ sudo bash
o
:~$ su
:~# visudo
consentirà a un amministratore di ispezionare e modificare i privilegi dei gruppi che possono usare il comando sudo.
Su sistemi simili a Unix basati su Debian, come Ubuntu, i gruppi 4 e 27 hanno generalmente diritti di accesso ai privilegi di sudo.
Il gruppo 4 è il gruppo di amministratori (adm) e il gruppo 27 è il sudo gid.
Per vedere quali utenti sono attualmente assegnati a questi gruppi cat il file / etc / group come mostrato di seguito:
:~$ cat /etc/group
Un output di esempio, su Ubuntu (ma non basato su Redhat, basato su Oracle Solaris / Solaris o su sistemi basati su BSD) produrrebbe questo:
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
Come possiamo dire, il tuo utente è l'amministratore del sistema e membro del gruppo 4 (adm). Ma il tuo utente e mio fratello sono entrambi membri del gruppo 27, che è il numero gid (identificazione del gruppo) del gruppo sudo. Quindi mybrother può anche ottenere i privilegi di root (super user).
Molti sistemi Linux come Fedora e Slackware, incorporano il gruppo di ruote gid = 10. Che consente i privilegi di amministratore quando viene applicato il comando sudo. Su sistemi basati su BSD (ad es. FreeBSD), l'utente root è un membro del gruppo di ruote che è gid 0.
Inoltre, utilizzando il comando id, qualsiasi utente può trovare nel sistema le informazioni di gruppo di un altro utente noto.
Per esempio:
:~$ id mybrother
Uscita campione
uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
Questo comando restituisce un elenco di utenti con diritti sudo:
awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' /etc/passwd
L'output è (ad es.):
<username> : <username> adm cdrom sudo dip plugdev lpadmin sambashare docker
Se viene visualizzato solo il nome utente, questo comando:
awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
Comando:
cat /etc/group | grep sudo
Produzione:
sudo:x:27:Tom,Stacy
Tom, Stacy sono gli utenti con privilegi di sudo.
cat
.
Ero sconcertato su come l' vagrant
utente può usare sudo
anche senza essere menzionato /etc/sudoers
né in /etc/group
né trovato con getent
.
Risulta sudo
inoltre legge voci da tutti i file in/etc/sudoers.d/
. Quindi, se non hai guardato attraverso quella directory, potresti non capire quanti utenti hanno effettivamente sudo
accesso.
Questo tipo di sudo
accesso può essere rilevato dalla risposta di JoKeR usando sudo -l -U vagrant
ma non viene rilevato da nessuna delle altre risposte qui che fanno affidamento su getent
o /etc/group
.