'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - quando importa chi viene usato o importa?


254

Quando sto facendo qualcosa che richiede che il root sia digitato in dozzine di volte di seguito, preferisco passare la mia sessione a una sessione root. Nelle varie tutorial e istruzioni che ho utilizzato su Internet, vedo sudo su, sudo su -, sudo -ie sudo /bin/bashviene utilizzato per aprire una sessione di root, ma non sono chiare sulla differenza tra questi e quando o se quello che conta di differenza.

Qualcuno può chiarire questo per me?


11
Hai dimenticato di chiedere sudo -se sudo su.
Radu Rădeanu,




3
@ RaduRădeanu Quando ho digitato la domanda ho esaminato le domande suggerite e nessuna di quelle ha veramente risposto alla mia domanda completa. Lo stesso vale per le domande a cui ti sei collegato. Sebbene contengano molte nuove informazioni per me, e grazie per il collegamento ad esse, le ho trovate non complete come la risposta fornita dal caos dell'utente di seguito, che è molto più in linea con ciò che stavo cercando.
Paul,

Risposte:


325

Per spiegare questo è necessario sapere cosa fanno i programmi:

  • su- Il comando suviene utilizzato per passare a un altro utente ( s strega u ser), ma si può anche passare per l'utente root richiamando il comando senza parametro. suti chiede di cambiare la password dell'utente, dopo aver digitato la password passata all'ambiente dell'utente.
  • sudo- sudoè pensato per eseguire un singolo comando con i privilegi di root. Ma a differenza suche richiede la password dell'utente corrente. Questo utente deve trovarsi nel file sudoers (o in un gruppo che si trova nel file sudoers). Per impostazione predefinita, Ubuntu "ricorda" la tua password per 15 minuti, in modo da non dover digitare la password ogni volta.
  • bash- Un'interfaccia di testo per interagire con il computer. È importante comprendere la differenza tra shell di accesso, non di accesso, interattive e non interattive:

Tipi di conchiglie:

  • shell di accesso : una shell di accesso accede al sistema come utente specificato, necessario per questo è un nome utente e una password. Quando si preme ctrl+ alt+ F1per accedere a un terminale virtuale, dopo aver effettuato correttamente l'accesso si ottiene una shell di accesso.
  • shell non di accesso : una shell che viene eseguita senza effettuare l'accesso, necessaria per questo è un utente attualmente connesso. Quando apri un terminale grafico in gnome, si tratta di una shell non di accesso.
  • shell interattiva : shell (login o non login) in cui è possibile digitare o interrompere in modo interattivo i comandi. Ad esempio un terminale gnome.
  • shell non interattiva : una shell (secondaria) probabilmente eseguita da un processo automatizzato. Non vedrai né input né output.

Quindi i casi sono:

  • sudo suChiama sudocon il comando su. Bash è chiamato come shell interattiva senza accesso. Quindi bash esegue solo .bashrc. Puoi vedere che dopo essere passati a root sei ancora nella stessa directory:

    user@host:~$ sudo su
    root@host:/home/user#
    
  • sudo su -Questa volta è una shell di login, quindi /etc/profile, .profilee .bashrcvengono eseguiti e ti troverai nella home directory di root con l'ambiente di root.

  • sudo -iÈ quasi uguale sudo su -all'opzione -i (simula il login iniziale) che esegue la shell specificata dalla voce del database delle password dell'utente di destinazione come shell di login. Ciò significa che specifica risorsa-login file come .profile, .bashrco .loginsarà letto ed eseguito dalla shell.

  • sudo /bin/bashCiò significa che si chiama sudocon il comando /bin/bash. /bin/bashviene avviato come shell di non accesso, quindi tutti i file dot non vengono eseguiti, ma bash stesso legge .bashrcl'utente chiamante. Il tuo ambiente rimane lo stesso. La tua casa non sarà la casa di root. Quindi sei root, ma nell'ambiente dell'utente chiamante.

  • sudo -slegge la $SHELLvariabile ed esegue il contenuto. Se $SHELLcontiene /bin/bash, invoca sudo /bin/bash(vedi sopra).

Dai un'occhiata:

Per verificare se ci si trova in una shell di accesso o meno (funziona solo in bash perché shoptè un comando incorporato):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

18
Solo un chiarimento: sudoconsente a un utente autorizzato di eseguire un comando come superutente o un altro utente . Comunque, +1 per i tuoi sforzi.
Radu Rădeanu,

2
@chaos Grazie per questa eccellente risposta! Risponde principalmente alle mie domande, quindi sono andato avanti e ho contrassegnato la risposta alla domanda, ma non capisco quando è desiderabile eseguire una shell particolare. Uso Ubuntu solo attraverso la riga di comando e trovo che il mio uso più comune per aprire una rootsessione utente (rispetto all'utilizzo sudo) sia quando sto facendo qualcosa che richiede un uso intenso dei rootprivilegi, come quando installo qualcosa di nuovo o eseguo una grande riconfigurazione . Ho usato sudo /bin/bash, ma a quanto pare quel metodo ha un brutto rap per qualche motivo che non capisco.
Paolo,

2
Inoltre, è più "corretto" dire che su sta per switch user, piuttosto che super user. Vale a dire eseguire uno script php: su www-data /usr/share/script.php o semplicemente su www-data per la shell interattiva. Ma su senza alcun nome utente assumerà l'account root (super user).
oblivian,

Chaos - "shopt -q login_shell && echo 'Login shell' || echo 'No login shell'" Questi tipi di suggerimenti che vedo spesso, ma perché farlo così a lungo? L'operatore && indica se il codice di uscita 0 quindi "esegue il comando successivo" e i tubi doppi (||) indicano altro (se non 0), quindi eseguire questo comando. Quindi, in pratica, ciò che dice se il codice di uscita 0 quindi echo "Login Shell", se il codice di uscita 1 (fallisce) quindi echo "No login". Perché non solo "shopt -q login_shell; echo $?" $? indica il codice risultato / uscita del comando precedente. Nella maggior parte se non tutti i programmi 0 significano successo, 1 o più significa fallimento. Quindi se l'eco è 0 = successo ...
obliviano


0

Per cercare le differenze, puoi cercare l'ambiente risultante tra diverse invocazioni.

Potresti trovare alcune "piccole" differenze in alcune variabili critiche:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

o qualche differenza in ~ /. gestione dotfiles ( ~/.config).

Considera anche la proprietà dei file di log basati su $ HOME ( ~/.xsession.errors, ecc ...) o dei cookie xauth ( ~/.Xauthority) generati dai comandi.

Prova questi comandi:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)


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.