Comando su: diferencia entre su y su -, sudo su y sudo -i, y cómo cambiar de cuenta
Para ejecutar comandos con otra cuenta en Linux sin cerrar la sesión de la cuenta actual, se usa el comando su. Al ejecutar su desde la cuenta root de un servidor AlmaLinux 9 hacia daemon, una cuenta de sistema que no puede iniciar sesión, un solo guion cambió la carpeta de trabajo y el PATH, y hubo que indicar un shell para que el comando se ejecutara.
La salida de abajo procede de un servidor AlmaLinux 9.8 (cuenta root) y un servidor Debian 12 (cuenta normal). Las pantallas que piden contraseña y sudo no se ejecutaron en un servidor en producción y se resumen según los manuales oficiales; parte del valor de PATH y el número de versión de parche de util-linux del simulador se cambiaron por valores de ejemplo.
1️⃣ Cómo usar el comando su
La forma básica es [su nombre_de_cuenta], y si omites el nombre de la cuenta, su cambia a root. Si escribes exit en el shell nuevo, ese shell termina y vuelves al shell de la cuenta original que ejecutó su.
Si lo ejecutas desde una cuenta normal, escribes la contraseña de la cuenta de destino en la línea Password: (según la configuración predeterminada de PAM). En este servidor, /etc/pam.d/su omite la autenticación cuando quien lo ejecuta es root, así que no se pidió contraseña al cambiar de la cuenta root a daemon.
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).Como dice la ayuda, el guion [-] es la opción de inicio de sesión, igual que [-l], y los argumentos escritos después del nombre de la cuenta pasan al shell de la cuenta de destino. En el servidor AlmaLinux 9, su venía en el paquete util-linux 2.37, y en el servidor Debian 12, en el paquete 2.38.
su --versionsu from util-linux 2.38.1Para saber si la cuenta a la que quieres cambiar puede abrir un shell, mira el último campo de su línea en getent passwd.
getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinEl shell de daemon era /sbin/nologin. Una cuenta que tiene nologin en lugar de un shell de inicio de sesión no abre un shell aunque cambies a ella con su.
2️⃣ Diferencia entre su y su -
Con un guion (-), su abre el mismo shell que obtendrías al iniciar sesión con la cuenta de destino. En la carpeta /tmp se ejecutó el mismo comando una vez sin guion y otra con guion.
su -s /bin/sh -c pwd daemon/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinSin guion, la carpeta de trabajo siguió siendo /tmp, mientras que [su -] pasó a la carpeta personal de daemon, /sbin. En este servidor /sbin es un enlace a /usr/sbin, por eso pwd mostró /usr/sbin.
En las variables de entorno se compararon solo cinco líneas de la salida de env: HOME, USER, SHELL, PATH y 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 y LOGNAME cambiaron a los valores de daemon en los dos casos. Sin guion, PATH conservó el valor de root, que ejecutó su, y con [su -] se definió de nuevo según la configuración de inicio de sesión.
Según el manual oficial, su sin guion cambia solo HOME y SHELL, y cambia también USER y LOGNAME solo cuando la cuenta de destino no es root. Por eso, si cambias a root desde una cuenta normal sin guion, USER conserva el nombre de la cuenta original.
[$0], que muestra el nombre del shell, también fue distinto.
su -s /bin/sh -c 'echo $0' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shCon [su -] se añadió un guion delante del nombre del shell y apareció -sh. Un shell cuyo nombre empieza por guion funciona como shell de inicio de sesión y lee los archivos de configuración de inicio de sesión (según el manual oficial). Las diferencias entre las dos formas son estas.
| Comparación | su | su - |
|---|---|---|
| Carpeta de trabajo | Sin cambios (/tmp) | Carpeta personal de la cuenta de destino (/usr/sbin) |
| HOME, USER, LOGNAME | Valor de daemon | Valor de daemon |
| PATH | Valor de root, que ejecutó su | Se define de nuevo con la configuración de inicio de sesión |
| Nombre del shell ($0) | sh | -sh (shell de inicio de sesión) |
| Otras variables de entorno | Se conservan | Se borran salvo algunas como TERM (según el manual oficial) |
El manual oficial recomienda añadir siempre la opción de inicio de sesión para que los entornos no se mezclen, y escribir [--login] en lugar del guion. su sin guion conserva la carpeta actual y el PATH, así que, si quieres comprobar un comando con la configuración de otra cuenta, el resultado puede ser distinto del de [su -].
3️⃣ Opciones su -c y su -s
Para ejecutar un solo comando con otra cuenta sin abrir un shell, escribe el comando después de -c. Al ejecutar id con [su -c] en la cuenta con nologin, apareció un mensaje de rechazo en lugar del resultado del comando.
su -c id daemonThis account is currently not available.El comando pasado con -c también lo recibe y ejecuta el shell de la cuenta, así que, si el shell es nologin, el comando nunca llega a ejecutarse. En ese caso, indica con -s el shell que se va a ejecutar.
su -s /bin/sh -c id daemonuid=2(daemon) gid=2(daemon) groups=2(daemon)Al indicar /bin/sh, id se ejecutó con el UID 2 de daemon. Usa esta forma para comprobar permisos de archivos o resultados de comandos con una cuenta de servicio.
Si el shell de la cuenta de destino es un shell restringido que no está en /etc/shells, como nologin, solo root puede cambiar el shell con -s. Según el manual oficial, en ese caso se ignoran -s y la variable SHELL indicados por un usuario que no sea root.
Si el comando después de -c tiene espacios, enciérralo entre comillas para pasarlo como un solo bloque. su devuelve tal cual el código de salida del comando que ejecutó, 126 si no pudo ejecutarlo y 127 si no lo encontró (según el manual oficial).
📌 Opciones principales: resultados de este artículo
| Opción | Tarea | Resultado en este artículo | |
|---|---|---|---|
| - | Abre el mismo shell que al iniciar sesión con la cuenta de destino y pasa a su carpeta personal | Desde /tmp, sin guion pwd fue /tmp y con guion /usr/sbin, y echo $0 mostró -sh | |
| -c comando | Ejecuta un comando con el shell de la cuenta de destino sin abrir un shell | Al ejecutar su -c id daemon en la cuenta con nologin daemon, apareció [This account is currently not available.] | |
| -s shell | Ejecuta el shell indicado en lugar del que tiene la cuenta; en cuentas con shell restringido, solo root | su -s /bin/sh -c id daemon mostró uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | Muestra el uso y la lista de opciones | Línea Usage y lista de opciones -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | Muestra la información de versión | su from util-linux 2.38.1 en el servidor Debian 12 |
📎 Otras opciones: según el manual oficial
| Opción | Tarea | |
|---|---|---|
| -l | Opción de inicio de sesión igual que el guion (-); nombre largo --login | |
| -m | Conserva las variables de entorno y no cambia HOME, SHELL, USER ni LOGNAME; se ignora junto con la opción de inicio de sesión (igual que -p) | |
| -w lista | Conserva las variables escritas con comas cuando la opción de inicio de sesión vacía el entorno; HOME, SHELL, USER, LOGNAME y PATH se definen de nuevo | |
| -g grupo | Indica el grupo principal; solo root | |
| -G grupo | Indica grupos suplementarios; solo root; sin -g, el primer grupo suplementario pasa a ser el grupo principal | |
| -f | Pasa -f al shell; opción que se usa en csh y tcsh | |
| -P | Crea un pseudoterminal nuevo para no compartir el terminal con la sesión original | |
| --session-command comando | Igual que -c pero sin crear una sesión nueva; el manual no lo recomienda |
🔲 Simulador del comando su
El simulador de abajo empieza con la cuenta normal user1, y puedes probar tú mismo su, [su -] y sudo y volver con exit. Las cuentas y las contraseñas son valores de ejemplo.
4️⃣ Diferencia entre sudo su y sudo -i
sudo su es la forma de ejecutar su con privilegios de root mediante sudo. Como su lo ejecuta root, no se pide la contraseña de root, y antes sudo pide la contraseña de quien lo ejecuta (según la documentación oficial).
Las cuentas que pueden ejecutar sudo se definen en la configuración de /etc/sudoers. Si una cuenta no permitida ejecuta sudo, se rechaza con [user1 is not in the sudoers file.] (según el mensaje del programa).
Para cada comando que abre un shell de root, la contraseña que se pide y la carpeta de trabajo son estas. Los comandos de este apartado no se ejecutaron en un servidor en producción y se resumen según los manuales su(1) y sudo(8).
| Comando | Contraseña que se pide | Shell que se ejecuta | Carpeta de trabajo |
|---|---|---|---|
| su | root | Shell de root | Sin cambios |
| su - | root | Shell de inicio de sesión de root | /root |
| sudo su | Cuenta que lo ejecutó | Shell de root | Sin cambios |
| sudo su - | Cuenta que lo ejecutó | Shell de inicio de sesión de root | /root |
| sudo -i | Cuenta que lo ejecutó | Shell de inicio de sesión de root | /root |
| sudo -s | Cuenta que lo ejecutó | Shell de la variable SHELL (privilegios de root) | Sin cambios |
[sudo -i] y [sudo su -] terminan los dos en un shell de inicio de sesión de root. Con [sudo -i], sudo ejecuta directamente el shell de root como shell de inicio de sesión, y [sudo su -] pasa una vez más por su entre medias.
[sudo -s] ejecuta el shell de la variable SHELL con privilegios de root y no pasa a la carpeta personal. Cuando escribes bien la contraseña una vez, sudo no vuelve a pedirla en el mismo terminal durante 5 minutos por defecto (según el manual de sudoers).
La diferencia entre su y sudo es como la diferencia entre pedir prestada la llave de una casa y anotar tu nombre en conserjería para entrar.
5️⃣ Errores del comando su
Si cambias a una cuenta que no puede iniciar sesión, se ejecuta nologin en lugar de un shell y aparece [This account is currently not available.]. Al ejecutar [su daemon] desde root solo apareció esta línea, y el código de salida fue 1.
su daemonThis account is currently not available.Este mensaje lo muestra el programa nologin indicado en el último campo de la línea de la cuenta, y el mismo texto se encontró dentro de /usr/sbin/nologin en el servidor. Si eres root, puedes indicar un shell con -s y ejecutar comandos con esa cuenta.
Si la contraseña no es correcta, aparece [su: Authentication failure]. Este texto es el mensaje que devuelve la biblioteca PAM cuando falla la autenticación. Según el manual oficial, si su falla antes de ejecutar el comando, el código de salida es 1.
Si su te rechaza aunque escribiste bien la contraseña de tu cuenta, comprueba primero si lo que se pide es la contraseña de la cuenta de destino. sudo pide la contraseña de quien lo ejecuta, y su pide la contraseña de la cuenta a la que cambias.
Si escribes un nombre de cuenta que no existe, aparece [su: user user9 does not exist or the user entry does not contain all the required fields] (según el mensaje del programa). La causa y lo que hay que comprobar en cada error son estos.
| Salida | Causa | Qué comprobar |
|---|---|---|
| This account is currently not available. | El shell de la cuenta de destino es nologin | Último campo de la línea de la cuenta en getent passwd; si eres root, indica un shell con -s |
| su: Authentication failure | La contraseña no es correcta | Si es la contraseña de la cuenta de destino (sudo pide la tuya) |
| su: user user9 does not exist … | No existe una cuenta con ese nombre | getent passwd nombre_de_cuenta |
| user1 is not in the sudoers file. | Cuenta sin permiso para sudo | Configuración de sudoers y grupo wheel |
🔢 FAQ & contenido recomendado
Permisos · propiedad
Permisos de Linux (4,2,1) y propiedad | comandos chmod, chown, umask
Artículo sobre cómo ver y cambiar los permisos de lectura, escritura y ejecución y el propietario de archivos y directorios.
Usuarios y acceso
Comandos who y w de Linux & comando user
Comandos para ver qué usuarios han iniciado sesión ahora en el servidor y qué tareas están ejecutando.
Red y acceso
Comando SSH: opciones y cómo usarlo
Artículo sobre la forma básica y las opciones del comando ssh, que se conecta a un servidor remoto con una cuenta de usuario.
ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.