su a sudo umožňují spouštět příkazy nebo shell s jiným uživatelem. V závislosti na tom, jak jsou vyvolány, se proměnné prostředí mohou změnit a způsobit různé výsledky příkazů.
Oba „su“ i „sudo“ umožňují provádět příkazy jménem jiného uživatele. Použití su předpokládá znalost „jiného“ uživatelského hesla, pokud není vyvoláno uživatelem root. Není moc kontroly nad tím, co může uživatel dělat, pokud je mu udělen přístup, neexistuje žádné omezení.
V sudo je jemné ovládání toho, co může uživatel dělat, jaké příkazy lze spouštět. Není potřeba znát heslo „jiného“ uživatele. Oprávnění jsou nastavena v konfiguračním souboru.
Poznámka :Použití sudo su [USER] by se nemělo používat, protože používá dvě změny kontextu zabezpečení. Doporučuje se použít sudo -u [USER].
su – spustí příkaz s náhradním ID uživatele a skupiny
Z manuálové stránky:
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.
Příklad:
# 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
V „su opc“ jsou proměnné prostředí použité ke spuštění příkazu původní, v tomto případě uživatelské kořenové prostředí. Pokud je příkaz vyvolán s „– “ nebo „–přihlášení ” prostředí je uživatel “opc”, kromě “TERM”.
Jak je vysvětleno na stránce manuálu:
-, -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 – vykoná příkaz jako jiný uživatel
Z manuálové stránky:
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.
Příklad:
# 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
V „sudo“ jsou proměnné prostředí předány z původní relace do relace „sudo“, jak je definováno v /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"
Definované proměnné jsou zachovány.
Použití „sudo -i“ může způsobit reset některých proměnných:
-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.
Například z výchozího /etc/sudoers bude proměnná PS1 zachována:
# PS1="%: " sudo -u opc bash %:
# PS1="%: " sudo -i -u opc bash [opc@[HOSTNAME] ~]$
Pokud je použito „-i“, způsobí to spuštění přihlašovacích zdrojových souborů, proměnná PS1 byla resetována podle nastavení v /etc/bashrc.