Comando su: differenza tra su e su -, sudo su e sudo -i, e come cambiare 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
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 --versionsu from util-linux 2.38.1Se l'account a cui vuoi passare può aprire una shell lo vedi dall'ultimo campo della sua riga in getent passwd.
getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinLa 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 -
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/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinSenza 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/binsu - -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/sbinHOME, 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' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shCon [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.
| Confronto | su | su - |
|---|---|---|
| Cartella di lavoro | Invariata (/tmp) | Cartella home dell'account di destinazione (/usr/sbin) |
| HOME, USER, LOGNAME | Valore di daemon | Valore di daemon |
| PATH | Valore di root, che ha eseguito su | Reimpostato dalle impostazioni di login |
| Nome della shell ($0) | sh | -sh (shell di login) |
| Altre variabili d'ambiente | Restano invariate | Cancellate 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
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 daemonThis 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 daemonuid=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
| Opzione | Compito | Risultato in questo articolo | |
|---|---|---|---|
| - | Apre la stessa shell di un login con l'account di destinazione e passa alla cartella home di quell'account | Da /tmp, senza trattino pwd era /tmp e con il trattino /usr/sbin, ed echo $0 dava -sh | |
| -c comando | Esegue un comando con la shell dell'account di destinazione senza aprire una shell | Eseguendo su -c id daemon sull'account con nologin daemon è comparso [This account is currently not available.] | |
| -s shell | Esegue la shell indicata al posto di quella dell'account; per gli account con shell limitata solo root | su -s /bin/sh -c id daemon ha dato uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | Mostra l'uso e l'elenco delle opzioni | Riga Usage ed elenco delle opzioni -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | Stampa le informazioni sulla versione | su from util-linux 2.38.1 sul server Debian 12 |
📎 Altre opzioni: secondo il manuale ufficiale
| Opzione | Compito | |
|---|---|---|
| -l | Opzione di login uguale al trattino (-); nome lungo --login | |
| -m | Lascia invariate le variabili d'ambiente e non cambia HOME, SHELL, USER né LOGNAME; ignorata insieme all'opzione di login (uguale a -p) | |
| -w elenco | Mantiene le variabili scritte con le virgole quando l'opzione di login svuota l'ambiente; HOME, SHELL, USER, LOGNAME e PATH vengono reimpostati | |
| -g gruppo | Indica il gruppo principale; solo root | |
| -G gruppo | Indica i gruppi supplementari; solo root; senza -g il primo gruppo supplementare diventa il gruppo principale | |
| -f | Passa -f alla shell; opzione usata in csh e tcsh | |
| -P | Crea un nuovo pseudo-terminale per non condividere il terminale con la sessione originale | |
| --session-command comando | Uguale 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.
4️⃣ Differenza tra sudo su e sudo -i
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).
| Comando | Password richiesta | Shell avviata | Cartella di lavoro |
|---|---|---|---|
| su | root | Shell di root | invariato |
| su - | root | Shell di login di root | /root |
| sudo su | Account che l'ha eseguito | Shell di root | invariato |
| sudo su - | Account che l'ha eseguito | Shell di login di root | /root |
| sudo -i | Account che l'ha eseguito | Shell di login di root | /root |
| sudo -s | Account che l'ha eseguito | Shell 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
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 daemonThis 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.
| Output | Causa | Cosa controllare |
|---|---|---|
| This account is currently not available. | La shell dell'account di destinazione è nologin | Ultimo campo della riga dell'account in getent passwd; da root, indica una shell con -s |
| su: Authentication failure | Password sbagliata | Se è la password dell'account di destinazione (sudo chiede la tua) |
| su: user user9 does not exist … | Nessun account con quel nome | getent passwd nome_account |
| user1 is not in the sudoers file. | Account non autorizzato a usare sudo | Configurazione di sudoers e gruppo wheel |
🔢 FAQ & contenuti consigliati
Permessi · proprietà
Permessi di Linux (4,2,1) e proprietà | comandi chmod, chown, umask
Un articolo su come verificare e cambiare i permessi di lettura, scrittura ed esecuzione e il proprietario di file e directory.
Utenti e accesso
Comandi Linux who e w & comando user
Comandi che mostrano quali utenti sono collegati ora al server e cosa stanno eseguendo.
Rete e accesso
Comando SSH: opzioni e come usarlo
Un articolo sulla forma di base e le opzioni del comando ssh, che si collega a un server remoto con un account utente.
ℹ️ 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.