Perché "sudo -u root echo" whoami` "non restituisce root?


11

Come si usa sudo per eseguire un comando come utente root effettivo su Ubuntu? Inizialmente pensavo che questo fosse il comportamento predefinito di sudo, fino a quando non ho eseguito:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

Tuttavia, questo è il tipo di comportamento che voglio, ma solo in una sola riga:

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root

11
perché l'eco whoami? Basta dire sudo whoami .. restituisce root
Neo

Risposte:


26

Infatti non farli girare come root. Ma quello che ti sta succedendo è che i segni di spunta posteriori vengono valutati prima delle sudo esecuzioni, poiché sono necessari per valutare il comando. Più direttamente, perché non solo questo:

sudo whoami

Le tue whoamizecche posteriori sono effettivamente valutate in una subshell come l'utente corrente, motivo per cui vedi quello che fai.


2
Questo è sbagliato. sudo funziona con i privilegi di root ma non come root.
Manfred Moser,

@Moser, allora perché il suo comando stampa "root"?
Cerin,

4
@ManfredMoser: funziona con l'UID di 0(zero), che è esattamente ciò che la gente chiama "root". (Avresti avuto ragione se sudosolo avessi esteso le sue capacità senza effettivamente modificare l'UID. Ma non è quello che fa.)
user1686

1
M. Moser potrebbe aver sollevato un punto sul set-UID solo modificando l' ID utente effettivo del processo, richiedendo che il processo stesso continui a cambiare l'ID utente reale, come effettivamente sudofa. Ma dalla lettura della risposta xyr, questo non sembra essere stato effettivamente il caso.
JdeBP,

7

Subshell ( whoami) viene eseguito per primo, come te, e il risultato ( myuser) viene inserito nel sudocomando; ciò che sudovede è echo myuser. Pensalo come una scorciatoia per:

tmpvar=`whoami`
sudo echo "$tmpvar"

1

Sembra che ci sia qualche supposizione in corso qui ...

I backtick stanno ovviamente facendo ciò che gli altri hanno spiegato, espandendosi whoamiprima di invocare 'sudo' e lasciando indietro i backtick come 'root', come previsto.

Ma è utile capire cosa sta realmente accadendo con sudo (8). Quindi ho effettivamente guardato la pagina man!

"L'UID e il GID reali ed efficaci sono impostati per corrispondere a quelli dell'utente target ..."

Quindi sembra che il comportamento osservato non abbia nulla a che fare con la differenza tra ID utente effettivo e reale.

È anche illustrativo fare "sudo printenv" e confrontarlo con solo "printenv", che in realtà mi ha sorpreso un po '. Mostra che [i] alcune [/ i] variabili esportate sono disponibili e altre no: riporta l'home, PATH, PS1, SHELL, TERM e EDITOR dell'utente che invoca, ma non altre come MANPATH, CVSROOT, LD_LIBRARY_PATH o ENV. Sembra un po 'strano, in quanto potrebbe far sì che i programmi si comportino in modo diverso rispetto a come fanno l'utente originale o come root.


0

sudo ti permette di eseguire qualsiasi comando con privilegi di root, ma non come utente root. Il motivo per cui ciò è utile è che con questa configurazione più persone possono avere i diritti di root ma tutte le registrazioni e così via indicano ancora chi ha apportato le modifiche.

Questa configurazione è migliore della condivisione delle password di root. Come tale ha sostituito il fatto di avere utenti root su molte distribuzioni tra cui Ubuntu.

sudo su d'altra parte ti rende gli utenti root e quindi non dovrebbe davvero essere usato.

Questa differenza spiega anche il comportamento osservato (corretto).


6
No. Ciò che spiega il comportamento è una questione molto semplice di come funziona la sostituzione dei comandi nella shell. Non ha niente a che fare con i privilegi.
JdeBP,

-2

Sudo concede temporaneamente a chiunque tu sia (dato che ti è permesso sudo in primo luogo) i privilegi di livello root.

Per essere root, dovresti accedere come root che è bloccato in Ubuntu per impostazione predefinita.

Devi stare attento con questo, sudo non è root. Se vuoi mostrare che Fred sta eseguendo qualcosa come sudo, che3d le variabili di ambiente SUDO, SUDO_COMMAND potrebbe essere il più utile.


Il root è bloccato in Ubuntu? Sei sicuro? So che è scoraggiato, ma ho pensato che lo rendessero leggermente più difficile per un principiante impostando una password oscura usando un UUID, che può essere modificato usando i soliti metodi.
Marty Fried
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.