Comando su: differenza tra su e su -, sudo su e sudo -i, e come cambiare account

Ambiente di testFamiglia RHELAlmaLinux 9.8util-linux 2.37account rootDebian 12 · util-linux 2.38 account normaleVerificato il 2026-11-05
Comandi per utenti · gruppisuPosizione/usr/bin/su
Eseguire comandi con un altro account

Per eseguire comandi con un altro account in Linux senza uscire dall'account attuale, usa il comando su. Eseguendo su dall'account root di un server AlmaLinux 9 verso daemon, un account di sistema che non può accedere, un solo trattino ha cambiato la cartella di lavoro e il PATH, e il comando è partito solo dopo aver indicato una shell.

L'output qui sotto proviene da un server AlmaLinux 9.8 (account root) e da un server Debian 12 (account normale). Le schermate che chiedono la password e sudo non sono stati eseguiti su un server in produzione e sono riassunti in base ai manuali ufficiali; una parte del valore di PATH e il numero di versione della patch di util-linux nel simulatore sono stati sostituiti con valori di esempio.

1️⃣ Come usare il comando su

  • ↪️ Forma di base e ritorno con exit

La forma di base è [su nome_account], e se ometti il nome dell'account, su passa a root. Se scrivi exit nella nuova shell, quella shell termina e torni alla shell dell'account originale che ha eseguito su.

Se lo esegui da un account normale, inserisci la password dell'account di destinazione alla riga Password: (in base all'impostazione predefinita di PAM). Su questo server /etc/pam.d/su salta l'autenticazione quando chi lo esegue è root, quindi passando dall'account root a daemon la password non è stata chiesta.

su --help

Usage:
 su [options] [-] [<user> [<argument>...]]

Change the effective user ID and group ID to that of <user>.
A mere - implies -l.  If <user> is not given, root is assumed.

Options:
 -m, -p, --preserve-environment      do not reset environment variables
 -w, --whitelist-environment <list>  don't reset specified variables

 -g, --group <group>             specify the primary group
 -G, --supp-group <group>        specify a supplemental group

 -, -l, --login                  make the shell a login shell
 -c, --command <command>         pass a single command to the shell with -c
 --session-command <command>     pass a single command to the shell with -c
                                   and do not create a new session
 -f, --fast                      pass -f to the shell (for csh or tcsh)
 -s, --shell <shell>             run <shell> if /etc/shells allows it
 -P, --pty                       create a new pseudo-terminal

 -h, --help                      display this help
 -V, --version                   display version

For more details see su(1).

Come indica la guida, il trattino [-] è l'opzione di login, uguale a [-l], e gli argomenti scritti dopo il nome dell'account passano alla shell dell'account di destinazione. Sul server AlmaLinux 9 su proveniva dal pacchetto util-linux 2.37, sul server Debian 12 dal pacchetto 2.38.

su --version
su from util-linux 2.38.1

Se l'account a cui vuoi passare può aprire una shell lo vedi dall'ultimo campo della sua riga in getent passwd.

getent passwd daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

La shell di daemon era /sbin/nologin. Un account che ha nologin al posto di una shell di login non apre una shell nemmeno dopo esserci passati con su.

2️⃣ Differenza tra su e su -

  • ↪️ Shell di login e variabili d'ambiente

Con un trattino (-), su apre la stessa shell che otterresti accedendo con l'account di destinazione. Nella cartella /tmp lo stesso comando è stato eseguito una volta senza trattino e una volta con il trattino.

su -s /bin/sh -c pwd daemon
/tmp
su - -s /bin/sh -c pwd daemon
/usr/sbin

Senza trattino la cartella di lavoro è rimasta /tmp, mentre [su -] è passato alla cartella home di daemon, /sbin. Su questo server /sbin è un collegamento a /usr/sbin, perciò pwd ha mostrato /usr/sbin.

Per le variabili d'ambiente sono state confrontate solo cinque righe dell'output di env: HOME, USER, SHELL, PATH e LOGNAME.

su -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='
SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
su - -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='
SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

HOME, USER e LOGNAME hanno preso i valori di daemon in entrambi i casi. Senza trattino PATH ha mantenuto il valore di root, che aveva eseguito su, mentre con [su -] è stato reimpostato secondo le impostazioni di login.

Secondo il manuale ufficiale, su senza trattino cambia solo HOME e SHELL, e cambia anche USER e LOGNAME solo se l'account di destinazione non è root. Quindi, se passi a root da un account normale senza trattino, in USER resta il nome dell'account originale.

Anche [$0], che mostra il nome della shell, era diverso.

su -s /bin/sh -c 'echo $0' daemon
sh
su - -s /bin/sh -c 'echo $0' daemon
-sh

Con [su -] davanti al nome della shell è comparso un trattino ed è stato mostrato -sh. Una shell il cui nome inizia con un trattino funziona come shell di login e legge i file di configurazione del login (secondo il manuale ufficiale). Le differenze tra le due forme sono queste.

Confrontosusu -
Cartella di lavoroInvariata (/tmp)Cartella home dell'account di destinazione (/usr/sbin)
HOME, USER, LOGNAMEValore di daemonValore di daemon
PATHValore di root, che ha eseguito suReimpostato dalle impostazioni di login
Nome della shell ($0)sh-sh (shell di login)
Altre variabili d'ambienteRestano invariateCancellate tranne alcune come TERM (secondo il manuale ufficiale)

Il manuale ufficiale consiglia di aggiungere sempre l'opzione di login perché gli ambienti non si mescolino, e di scrivere [--login] invece del trattino. su senza trattino mantiene la cartella attuale e il PATH, quindi, se vuoi verificare un comando con le impostazioni di un altro account, il risultato può essere diverso da quello di [su -].

3️⃣ Opzioni su -c e su -s

  • ↪️ Eseguire un solo comando e indicare la shell

Per eseguire un solo comando con un altro account senza aprire una shell, scrivi il comando dopo -c. Eseguendo id con [su -c] sull'account con nologin, al posto dell'output del comando è comparso un messaggio di rifiuto.

su -c id daemon
This account is currently not available.

Anche il comando passato con -c viene ricevuto ed eseguito dalla shell dell'account, quindi se la shell è nologin il comando non viene mai raggiunto. In questo caso indica con -s la shell da eseguire.

su -s /bin/sh -c id daemon
uid=2(daemon) gid=2(daemon) groups=2(daemon)

Indicando /bin/sh, id è stato eseguito con l'UID 2 di daemon. Usa questa forma per verificare permessi dei file o risultati dei comandi con un account di servizio.

Se la shell dell'account di destinazione è una shell limitata non presente in /etc/shells, come nologin, solo root può cambiare la shell con -s. Secondo il manuale ufficiale, in questo caso -s e la variabile SHELL indicati da un utente diverso da root vengono ignorati.

Se il comando dopo -c contiene spazi, racchiudilo tra virgolette per passarlo come un unico blocco. su restituisce così com'è il codice di uscita del comando eseguito, 126 se non è riuscito a eseguirlo e 127 se non l'ha trovato (secondo il manuale ufficiale).

📌 Opzioni principali: risultati di questo articolo

OpzioneCompitoRisultato in questo articolo
-Apre la stessa shell di un login con l'account di destinazione e passa alla cartella home di quell'accountDa /tmp, senza trattino pwd era /tmp e con il trattino /usr/sbin, ed echo $0 dava -sh
-c comandoEsegue un comando con la shell dell'account di destinazione senza aprire una shellEseguendo su -c id daemon sull'account con nologin daemon è comparso [This account is currently not available.]
-s shellEsegue la shell indicata al posto di quella dell'account; per gli account con shell limitata solo rootsu -s /bin/sh -c id daemon ha dato uid=2(daemon) gid=2(daemon) groups=2(daemon)
--helpMostra l'uso e l'elenco delle opzioniRiga Usage ed elenco delle opzioni -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V
--versionStampa le informazioni sulla versionesu from util-linux 2.38.1 sul server Debian 12

📎 Altre opzioni: secondo il manuale ufficiale

OpzioneCompito
-lOpzione di login uguale al trattino (-); nome lungo --login
-mLascia invariate le variabili d'ambiente e non cambia HOME, SHELL, USER né LOGNAME; ignorata insieme all'opzione di login (uguale a -p)
-w elencoMantiene le variabili scritte con le virgole quando l'opzione di login svuota l'ambiente; HOME, SHELL, USER, LOGNAME e PATH vengono reimpostati
-g gruppoIndica il gruppo principale; solo root
-G gruppoIndica i gruppi supplementari; solo root; senza -g il primo gruppo supplementare diventa il gruppo principale
-fPassa -f alla shell; opzione usata in csh e tcsh
-PCrea un nuovo pseudo-terminale per non condividere il terminale con la sessione originale
--session-command comandoUguale a -c ma senza creare una nuova sessione; il manuale lo sconsiglia

🔲 Simulatore del comando su

Il simulatore qui sotto parte dall'account normale user1, e puoi provare da solo su, [su -] e sudo e tornare indietro con exit. Account e password sono valori di esempio.

Simulatore del comando suutil-linux 2.37
[user1@server1 ~]$
Funziona solo nel browser; account e password sono valori di esempio, e con ↑↓ richiami i comandi precedenti (le password non restano nella cronologia).

4️⃣ Differenza tra sudo su e sudo -i

  • ↪️ Password richiesta e cartella che cambia

sudo su esegue su con i privilegi di root tramite sudo. Dato che su viene eseguito da root, la password di root non viene chiesta, e prima sudo chiede la password di chi lo esegue (secondo la documentazione ufficiale).

Gli account che possono eseguire sudo sono definiti nella configurazione di /etc/sudoers. Se un account non autorizzato esegue sudo, viene rifiutato con [user1 is not in the sudoers file.] (secondo il messaggio del programma).

Per ogni comando che apre una shell di root, ecco la password richiesta e la cartella di lavoro. I comandi di questa sezione non sono stati eseguiti su un server in produzione e sono riassunti in base ai manuali su(1) e sudo(8).

ComandoPassword richiestaShell avviataCartella di lavoro
surootShell di rootinvariato
su -rootShell di login di root/root
sudo suAccount che l'ha eseguitoShell di rootinvariato
sudo su -Account che l'ha eseguitoShell di login di root/root
sudo -iAccount che l'ha eseguitoShell di login di root/root
sudo -sAccount che l'ha eseguitoShell della variabile SHELL (privilegi di root)invariato

[sudo -i] e [sudo su -] finiscono entrambi in una shell di login di root. Con [sudo -i] sudo avvia direttamente la shell di root come shell di login, mentre [sudo su -] passa ancora una volta da su nel mezzo.

[sudo -s] esegue la shell della variabile SHELL con i privilegi di root e non passa alla cartella home. Una volta inserita la password corretta, sudo non la richiede di nuovo nello stesso terminale per 5 minuti per impostazione predefinita (secondo il manuale di sudoers).

La differenza tra su e sudo è come quella tra prendere in prestito la chiave di casa e scrivere il proprio nome in portineria per entrare.

5️⃣ Errori del comando su

  • ↪️ This account is currently not available · Authentication failure

Se passi a un account che non può accedere, al posto di una shell viene eseguito nologin e compare [This account is currently not available.]. Eseguendo [su daemon] da root è comparsa solo questa riga, con codice di uscita 1.

su daemon
This account is currently not available.

Questo messaggio viene mostrato dal programma nologin indicato nell'ultimo campo della riga dell'account, e lo stesso testo è stato trovato dentro /usr/sbin/nologin sul server. Se sei root, puoi indicare una shell con -s ed eseguire comandi con quell'account.

Se la password è sbagliata, compare [su: Authentication failure]. Questo testo è il messaggio che la libreria PAM restituisce quando l'autenticazione fallisce. Secondo il manuale ufficiale, se su fallisce prima di eseguire il comando, il codice di uscita è 1.

Se su rifiuta anche se hai inserito correttamente la password del tuo account, controlla prima se ti viene chiesta la password dell'account di destinazione. sudo chiede la password di chi lo esegue, mentre su chiede quella dell'account a cui stai passando.

Se scrivi un nome di account che non esiste, compare [su: user user9 does not exist or the user entry does not contain all the required fields] (secondo il messaggio del programma). Ecco la causa e cosa controllare per ogni errore.

OutputCausaCosa controllare
This account is currently not available.La shell dell'account di destinazione è nologinUltimo campo della riga dell'account in getent passwd; da root, indica una shell con -s
su: Authentication failurePassword sbagliataSe è la password dell'account di destinazione (sudo chiede la tua)
su: user user9 does not exist …Nessun account con quel nomegetent passwd nome_account
user1 is not in the sudoers file.Account non autorizzato a usare sudoConfigurazione di sudoers e gruppo wheel

🔢 FAQ & contenuti consigliati

Il manuale ufficiale descrive su soprattutto come comando per gli utenti normali e, per gli script eseguiti da root, consiglia il comando runuser, che non passa dall'autenticazione. La forma è [runuser -u account -- comando].

Se scrivi dopo -w (--whitelist-environment) i nomi delle variabili da mantenere, separati da virgole, [su -] mantiene quelle variabili quando svuota l'ambiente. Secondo il manuale ufficiale, HOME, SHELL, USER, LOGNAME e PATH vengono reimpostati anche se sono nell'elenco.

Secondo il manuale ufficiale, su registra sempre i tentativi di accesso falliti nel file btmp e non scrive nel file lastlog. I record di btmp si consultano con il comando lastb.

ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 7   +   4   =