su vs sudo -s vs sudo -i vs sudo bash


89

Qual è la differenza tra i seguenti comandi:

su
sudo -s
sudo -i
sudo bash

Lo so per suaver bisogno di conoscere la password di root, e per sudodevo essere nel sudoersfile, ma una volta eseguito qual è la differenza?

So che c'è una differenza tra sue sudo -sperché la mia directory home è /rootdopo l'esecuzione su, ma la mia directory home è ancora /home/mynamedopo sudo -s. Ma sospetto che questo sia solo un sintomo di una differenza di fondo che mi manca.


3
Preferisco usare In sudo su - questo modo non hai bisogno della password di root e mi -assicuro che la home directory sia impostata correttamente.
Jens Timmerman,

Risposte:


114

Con su, diventi un altro utente - root per impostazione predefinita, ma potenzialmente un altro utente. Se dici su -, il tuo ambiente viene sostituito anche con l'ambiente di accesso di quell'utente, in modo che ciò che vedi sia indistinguibile dall'accesso come quell'utente. Non è possibile che il sistema sappia cosa fai mentre sei suad un altro utente dalle azioni di quell'utente quando effettuano l'accesso.

Le cose sono molto diverse con sudo:

  • I comandi che esegui vengono sudo eseguiti come utente di destinazione - root per impostazione predefinita, ma modificabile -u- ma registra i comandi che lo esegui, taggandoli con il tuo nome utente in modo che la colpa possa essere assegnata in seguito. :)

  • sudoè molto flessibile. È possibile limitare i comandi che un determinato utente o gruppo di utenti possono eseguire, ad esempio. Con su, è tutto o niente.

    Questa funzionalità viene in genere utilizzata per definire i ruoli. Ad esempio, è possibile definire un gruppo di "backup" che può essere eseguito dumpe tar, ognuno dei quali necessita dell'accesso root per eseguire correttamente il backup del disco di sistema.

    Ne parlo qui perché significa che puoi dare a qualcuno sudoprivilegi senza dargli sudo -so sudo bashabilità. Hanno solo le autorizzazioni di cui hanno bisogno per fare il loro lavoro, mentre con suloro hanno eseguito l'intero sistema. Devi stare attento con questo, però: se dai a qualcuno la possibilità di dire sudo vi, per esempio, può sborsare vie avere effettivamente lo stesso potere di con sudo -s.

  • Poiché richiede la password del sudoer anziché la password di root, sudoisola le autorizzazioni tra più sudoer.

    Questo risolve un problema amministrativo su, ovvero che quando cambia la password di root, tutti coloro che dovevano conoscerla per usare sudovevano essere informati. sudoconsente alle password dei sudoer di cambiare in modo indipendente. In effetti, è comune bloccare con password l'account dell'utente root su un sistema sudoper forzare l'esecuzione di tutte le attività sysadmin sudo. In una grande organizzazione con molti sudoer fidati, questo significa che quando uno dei amministratori di sistema lascia, non è necessario modificare la password di root e distribuirla agli amministratori che rimangono.

La differenza principale tra sudo bashe sudo -sè che -sè più breve e ti consente di passare i comandi per eseguire nella shell predefinita dell'utente in un paio di modi:

  1. Puoi dire sudo -s some-commandquale corre some-commandsotto la tua shell. È praticamente una scorciatoia per sudo $SHELL -c some-command.

  2. È possibile invece passare i comandi all'input standard della shell, come sudo -s < my-shell-script. Puoi usarlo con un heredoc per inviare più comandi a una singola sudochiamata, evitando la necessità di digitare sudopiù volte.

Entrambi questi comportamenti sono opzionali. Molto più comunemente, dai da -ssolo, quindi esegue la shell dell'utente in modo interattivo. In quella modalità, differisce dal fatto sudo bashche potrebbe eseguire una shell diversa rispetto a quella bash, poiché appare prima nella SHELLvariabile di ambiente, quindi se non è impostata, l'impostazione della shell di accesso dell'utente, in genere in /etc/passwd.

La shell gestita sudo -seredita l'ambiente dell'utente corrente. Se ciò che si desidera effettivamente è un ambiente pulito, come quello che si ottiene subito dopo l'accesso, ciò che si desidera è invece sudo -iun'aggiunta relativamente recente sudo. In parole povere, sudo -iè sudo -scome su -è su: reimposta tutte le variabili d'ambiente tranne alcune e ti rimanda alla home directory dell'utente. Se non gli dai anche i comandi per essere eseguito sotto quella shell tramite input standard o sudo -i some-command, eseguirà quella shell come shell di login interattiva, quindi gli script di avvio della shell dell'utente (ad es. .bash_profile) Verranno eseguiti di nuovo.

Tutto ciò rende sudo -inotevolmente più sicuro di sudo -s. Perché? Perché se qualcuno può modificare il tuo ambiente prima sudo -s, potrebbe causare l'esecuzione di comandi non intenzionali. Il caso più ovvio è la modifica SHELL, ma può anche accadere meno direttamente, come via PAGERse dici man foosotto sudo -s.

Potresti dire "Se possono modificare PAGER, possono modificare PATH, e quindi possono semplicemente sostituire un sudoprogramma malvagio ", ma qualcuno sufficientemente paranoico può dire /usr/bin/sudo /bin/bashdi evitare quella trappola. Probabilmente non sei così paranoico da evitare anche le trappole in tutte le altre variabili d'ambiente sensibili. Ti sei anche ricordato di controllare EDITOR, ad esempio, prima di eseguire qualsiasi comando VCS ? Quindi sudo -i.

Dato che sudo -icambia anche la tua directory di lavoro nella home directory del tuo utente, potresti comunque voler utilizzare sudo -sper quelle situazioni in cui sai di voler rimanere nella stessa directory cdin cui ti eri imbattuto durante l'esecuzione sudo. Tuttavia, è ancora più sicuro da sudo -ie cdverso dove eri.


2
Cosa intendi con "shell out of vi"?
crisron,

11
@crisron: dall'interno vi, digita :she premi Invio. Ora sei in una sotto-shell, con tutti i privilegi del viprocesso che ha generato quella shell. Se viè in esecuzione con i privilegi di root, lo sarà anche la shell. Oppure, puoi eseguire qualcosa di diverso da una shell tramite :!cmd, leggere l'output di un comando nel buffer di modifica tramite :r !cmd, ecc. Se tutti questi sono bloccati, le Makefiledestinazioni sono script di shell e Vim ha il :makecomando, che ti consente effettivamente di eseguire shell arbitraria script dall'interno dell'editor. Le possibilità di malizia sono troppo immense per contenere questa casella di commento.
Warren Young,

2
se qualcuno può mettere un falso in bash nel tuo PERCORSO, allora qualcuno può mettere un falso sudo nel tuo PERCORSO. per essere veramente sicuri devi invocare sudo usando il percorso completo:/usr/bin/sudo
lesmana,

1
@lesmana: l'ho affrontato in una modifica; fondamentalmente, PATHnon è l'unico problema.
Warren Young,

6
Grande spiegazione; grande mal di testa leggendolo.
lobi,

27

Da un post su ubuntuforums che ho scritto qualche tempo fa:

Considera il seguente esperimento:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

Ecco le differenze che ho riscontrato:

Con sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

Con sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Notare la differenza in $HOME. Essere root e aver $HOMEimpostato la casa dell'utente normale può causare problemi. Ad esempio, se si esegue un'app grafica, l'utente normale ~/.Xauthoritypuò essere sovrascritto da root. Ciò causa in seguito i normali problemi dell'utente, ad esempio la mancata esecuzione di determinate app grafiche tramite cron.

Riassumere:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games probabilmente impostato da /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

La linea di fondo sudo -iè il comando corretto da eseguire quando si desidera una shell di root che non sia contaminata dall'ambiente dell'utente.


1
Quanto l'ambiente sia "contaminato" dipende anche dalla configurazione di sudo(nei /etc/sudoersfile e relativi). Impostazioni di configurazione come always_set_home, env_reset, env_keep, env_checke env_reset, e questi possono variare a seconda dell'utente e comando. Vedi la sezione 'Ambiente di comando' e OPZIONI SUDOERS della manpage sudoers (5) .
Curt J. Sampson,

Personalmente, vado con sudo -Hsquando voglio un ambiente non contaminato dalle mie impostazioni, perché uso zsh e tutti gli account dell'applicazione che potrei cambiare per usare bash. Ciò consente a un certo numero di variabili d'ambiente di passare senza problemi, ma in genere trovo quelle che contano vengono sovrascritte da /etc/profile.d/*.
Ed Grimm,

7

su( S strega u ser o s ubstitute u ser) consente di passare all'utente. sufondamentalmente avvia un'altra istanza della shell con i privilegi dell'utente previsto. Per impostazione predefinita, passa rootall'utente, se vogliamo passare a un utente specifico, dobbiamo passare l'utente come segue:

$ su bob  # switches to bob (requires bob's password)

su -indica che le variabili di ambiente verranno ripristinate alla radice e suindica le variabili di ambiente come vecchio utente.

ad esempio: home directory di root se si utilizza su -o home directory dell'utente precedente se si utilizza su.

sudo ( s uper u ser do ) è un'utilità della riga di comando che consente agli utenti di eseguire programmi con i privilegi di sicurezza di un altro utente, per impostazione predefinita è superuser cioè root. Utilizza un file di configurazione /etc/sudoersche elenca quali utenti hanno diritti su azioni specifiche

sudo dovrebbe essere letto come / ˈsuːduː / . sintassi sudo commandcioè s strega u ser e fare questo comando.

  • suè equivalente sudo -ie simula un accesso all'account di root. La tua directory di lavoro sarà /roote leggerà root .profileecc. Il prompt cambierà da $ a #, indicando che hai accesso root.

  • sudo -s avvia una shell come root, ma non cambia la directory di lavoro.

  • sudo bash dove bashè il comando con cui eseguire sudo. Questo comando viene eseguito bashcome superutente.

  • Utilizzando sudopuò essere registrato tutto ciò che qualcuno fa.
  • L'uso sudoimpedisce a un utente di conoscere la password di root.
  • Usando sudopossiamo limitare i comandi possono eseguire.
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.