su e sudo consentono di eseguire comandi o shell con un utente diverso. A seconda di come vengono richiamate, le variabili di ambiente possono cambiare, causando risultati di comando diversi.
Sia "su" che "sudo" consentono di eseguire comandi per conto di altri utenti. L'utilizzo di su implica la conoscenza della password dell'utente “altro” salvo se invocata da root. Non c'è molto controllo su ciò che l'utente può fare, se l'accesso è concesso non ci sono restrizioni.
In sudo c'è un controllo preciso su cosa può fare l'utente, quali comandi possono essere eseguiti. Non è necessario conoscere la password dell'utente “altro”. I permessi sono impostati in un file di configurazione.
Nota :L'uso di sudo su [USER] dovrebbe essere evitato, poiché utilizza due modifiche al contesto di sicurezza. Si consiglia di utilizzare sudo -u [USER].
su – esegui un comando con utente sostitutivo e ID gruppo
Dalla pagina man:
su allows to run commands with substitute user and group ID. When called without arguments su defaults to running an interactive shell as root. For backward compatibility su defaults to not change the current direc‐ tory and to only set the environment variables HOME and SHELL (plus USER and LOGNAME if the target user is not root). It is recommended to always use the --login option (instead it's shortcut -) to avoid side effects caused by mixing environments.
Esempio:
# su opc -c 'echo $PATH' /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# su - opc -c 'echo $PATH' /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/opc/.local/bin:/home/opc/bin
In “su opc” la variabile d'ambiente utilizzata per eseguire il comando è quella originale, in questo caso l'ambiente root dell'utente. Se il comando viene invocato con “– ” o “–accesso ” l'ambiente è l'utente “opc”, ad eccezione di “TERM”.
Come spiegato dalla pagina di manuale:
-, -l, --login Starts the shell as login shell with an environment similar to a real login: o clears all environment variables except for TERM o initializes the environment variables HOME, SHELL, USER, LOGNAME, PATH o changes to the target user's home directory o sets argv[0] of the shell to '-' in order to make the shell a login shell
sudo – esegue un comando come un altro utente
Dalla pagina man:
sudo allows a permitted user to execute a command as the superuser or another user, as specified by the security policy. The invoking user's real (not effective) user ID is used to determine the user name with which to query the security policy.
Esempio:
# sudo -u opc bash -c 'echo $PATH' /sbin:/bin:/usr/sbin:/usr/bin
# sudo -i -u opc bash -c 'echo $PATH' /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/home/opc/.local/bin:/home/opc/bin
In “sudo” le variabili d'ambiente vengono passate dalla sessione originale alla sessione “sudo” come definito in /etc/sudoers:
Defaults env_reset Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS" Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Le variabili definite vengono conservate.
L'uso di "sudo -i" può causare il ripristino di alcune variabili:
-i, --login Run the shell specified by the target user's password data‐ base entry as a login shell. This means that login-specific resource files such as .profile, .bash_profile or .login will be read by the shell. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed. sudo attempts to change to that user's home directory before running the shell. The command is run with an environment similar to the one a user would receive at log in. Note that most shells behave differently when a command is specified as compared to an interactive session; consult the shell's man‐ ual for details. The Command environment section in the sudoers(5) manual documents how the -i option affects the environment in which a command is run when the sudoers policy is in use.
Esempio, da default /etc/sudoers, la variabile PS1 sarà conservata:
# PS1="%: " sudo -u opc bash %:
# PS1="%: " sudo -i -u opc bash [opc@[HOSTNAME] ~]$
Se viene utilizzato "-i", verrà eseguito il file delle risorse di accesso, la variabile PS1 è stata reimpostata come impostata in /etc/bashrc.