Linux / Comando / su: cambiar de usuario y ejecutar comandos con su cuenta

su es una herramienta para ejecutar un shell o comandos con identificadores de la cuenta y de los grupos de destino. Si no se especifica un usuario, generalmente se dirige a root, y al usar su --login USUARIO se puede cambiar a un entorno similar al de aquel usuario que ha iniciado sesión directamente.

Un simple su USUARIO mantiene el directorio de trabajo actual y parte del entorno, por lo que se pueden mezclar las configuraciones de diferentes usuarios. Para un cambio de cuenta interactivo generalmente se utiliza su --login USUARIO, y si el objetivo es ejecutar solo un comando de administrador, primero es recomendable revisar si sudo basado en políticas es más adecuado.

¿Qué es el comando su?

su ejecuta comandos con identificadores de usuario y grupo de la cuenta de destino. Si se omite el nombre de usuario, intenta ejecutar un shell interactivo con la cuenta root.

su de util-linux realiza autenticación, gestión de cuentas y sesiones a través de PAM (Pluggable Authentication Modules). Qué contraseña es necesaria, si solo ciertos grupos pueden usar su y dónde se registran los intentos puede variar según la PAM del sistema y la configuración de seguridad de la distribución.

Este artículo se basa en la implementación de util-linux, ampliamente utilizada en Linux. El funcionamiento exacto y los archivos de configuración específicos del sistema se pueden consultar en la página del manual oficial de util-linux su.

Sintaxis básica y cambio de cuenta

La sintaxis básica es la siguiente.

su [OPCIONES] [-] [USUARIO [ARGUMENTOS...]]

Si no se especifica un usuario, se intentará cambiar a la cuenta root.

su

Si un usuario normal lo ejecuta, normalmente se le pedirá la contraseña de la cuenta root de destino. Si la cuenta root está bloqueada o la política PAM no lo permite, no se podrá cambiar incluso si se conoce la contraseña correcta del usuario.

La cuenta deploy es un ejemplo: debe existir y la política de autenticación debe permitir el cambio. No cree ni habilite una cuenta privilegiada solo para probar estos comandos. Al terminar, utilice exit para regresar al shell anterior.

su deploy

Para volver al shell original, ejecute exit en el shell cambiado o presione Ctrl+D.

exit

Diferencias entre su y su --login

Clasificación su USUARIO su --login USUARIO
Directorio de trabajo Mantener el directorio actual Moverse al directorio home del usuario destino
Variables de entorno Solo se modifican algunas, pudiendo mezclarse con el entorno existente Eliminar la mayoría y configurar el entorno de inicio de sesión del usuario destino
PATH Está influenciado por la configuración del sistema y por PAM Inicializar según el entorno de inicio de sesión objetivo
Modo de inicio de shell Shell interactivo normal Iniciar como shell de inicio de sesión
Situaciones recomendadas En casos limitados destinados a mantener el entorno Cambio de usuario interactivo común

El manual de util-linux recomienda usar --login para evitar efectos secundarios causados por la mezcla de entornos. La forma corta - tiene el mismo significado.

su --login deploy
su - deploy

Entorno que cambia en el shell de inicio de sesión

Limpia la mayoría de las variables de entorno existentes

su --login de util-linux borra el entorno existente excepto las variables explícitamente permitidas TERM, COLORTERM y NO_COLOR. Después, HOME, SHELL, USER, LOGNAME y PATH se inicializan según el usuario objetivo.

No se debe asumir que el entorno final es completamente igual en todas las distribuciones, ya que también puede reflejar valores que los módulos PAM hayan agregado o modificado.

Ir al directorio home del usuario objetivo

--login inicia una shell de login después de ir al directorio home del usuario objetivo. Después de cambiar, se puede verificar el usuario, home y directorio de trabajo con los comandos siguientes.

id
printf '%s\n' "$HOME"
pwd

Los archivos de inicialización de la shell cambian

La shell de login lee los archivos de inicialización de login según las reglas de la shell que se esté utilizando. En Bash, puede verse afectada por /etc/profile, ~/.bash_profile, etc., según la configuración del sistema y del usuario. Compruebe el orden real en el manual de la shell de destino y la configuración de la cuenta.

Opciones de su que se usan con frecuencia

Opciones Función Uso y precauciones
-, -l, --login Cambiar al entorno del shell de inicio de sesión Generalmente recomendado para el cambio interactivo
-c COMANDO, --command COMANDO Enviar un solo comando al shell Se deben verificar las comillas y el estado de salida
-s SHELL, --shell SHELL Especificar el shell a ejecutar En cuentas de shell restringidas, puede ser ignorado si el llamador no es root
-m, -p, --preserve-environment Conservar al máximo el entorno actual Se ignora cuando se usa con --login y se debe usar con precaución por seguridad
-w LISTA, --whitelist-environment LISTA Conservar las variables de entorno especificadas al cambiar de inicio de sesión Separado por comas, excluyendo las variables de cuentas principales
-P, --pty Crear un terminal auxiliar separado en la sesión Útil para la separación de terminales en sesiones interactivas
-g GRUPO Especificar grupo predeterminado Solo el usuario root puede usarlo
-G GRUPO Especificar grupo secundario Solo puede ser usado por el usuario root y es repetible

Ejecutar un solo comando como otro usuario

Ejecutar un comando con -c

Si no necesita permanecer en un shell interactivo, puede pasar comandos al shell del usuario objetivo con -c.

su -c 'id' deploy

Cuando el comando termina, su también termina y volverá al shell original. La cadena de comando será reinterpretada por el shell objetivo, así que preste atención a las comillas, expansión de variables y el momento de ejecución de redirecciones.

Ejecutar comandos en el entorno de inicio de sesión

Para ejecutar comandos en el entorno de inicio de sesión y en el directorio home del usuario objetivo, use --login.

su --login -c 'pwd; id' deploy

Ambos comandos conectados por un punto y coma se ejecutan dentro del shell del usuario objetivo. No concatene directamente entradas externas a la cadena de comandos, ya que hay riesgo de inyección de comandos, por lo que no transmita cadenas generadas dinámicamente con privilegios elevados.

Verificar el estado de finalización del comando

su generalmente devuelve el estado de finalización del comando ejecutado. En la implementación de util-linux, si no se puede ejecutar el comando, devuelve 126; si no se encuentra el comando, devuelve 127; y si ocurre un error general antes de ejecutar el comando, puede devolver 1.

su -c '/usr/local/bin/check-job' deploy
status=$?
printf 'exit=%s\n' "$status"

/usr/local/bin/check-job representa un programa existente que debe preparar y revisar. Guarde el estado de su inmediatamente: el printf posterior puede terminar con éxito aunque el programa haya fallado. Si el script necesita propagar el resultado, termine con exit "$status" después de informar.

Manejo de la shell y cuentas restringidas

Shell predeterminada del usuario objetivo

Si no hay opciones separadas, generalmente se utiliza la shell especificada en la entrada de passwd de la cuenta objetivo, y si no está, se reemplaza por /bin/sh. Al verificar la información de la cuenta, no modifique arbitrariamente todo /etc/passwd, sino consúltelo de la siguiente manera.

getent passwd deploy

Especificar la shell con -s

Se puede especificar otra shell con -s.

su -s /bin/sh -c 'id' deploy

Si el shell de la cuenta objetivo es un shell restringido que no está en /etc/shells, el shell especificado por un usuario común puede ser ignorado. Que root pueda eludir las restricciones no significa que sea seguro abrir un shell interactivo en una cuenta de servicio.

Respetar el propósito de la cuenta de servicio

Es probable que las cuentas con nologin o false como shell designado no estén destinadas a inicio de sesión interactivo. Si necesita trabajar con esa cuenta, ejecute solo el comando necesario y primero compruebe si existen comandos de administración o funciones de systemd proporcionadas por el servicio.

Usar la preservación de variables de entorno con precaución

Significado de --preserve-environment

--preserve-environment preserva el entorno actual sin establecer de nuevo HOME, SHELL, USER o LOGNAME. Si se especifica con --login, se ignorará.

su --preserve-environment deploy

A menos que sea un caso especial en que se deba pasar la configuración del usuario que llama tal cual, la combinación del home y del entorno de ejecución de la cuenta objetivo puede producir propiedades de archivos inesperadas o cambios de configuración.

Permitir solo las variables necesarias

En util-linux, es posible combinar --login y --whitelist-environment para conservar solo las variables necesarias.

su --login --whitelist-environment=LANG,LC_ALL deploy

HOME, SHELL, USER, LOGNAME, PATH están excluidos de la lista blanca. Las variables de localización también pueden afectar el funcionamiento del programa, así que pase solo los valores necesarios.

Diferencias entre su y sudo

Clasificación su sudo
Objetivo principal Ejecutar un shell o comando como otro usuario Ejecutar un comando permitido por la política como otro usuario
Autenticación común Contraseña del usuario objetivo Contraseña del usuario que llama
Alcance de permisos Se pueden seguir usando los permisos de la cuenta de destino en el shell cambiado Se puede limitar a comandos y condiciones permitidas
Auditoría y seguimiento Centrado en el registro de cambio de sesión y se requiere seguimiento separado de los comandos internos Las solicitudes de ejecución se pueden registrar mediante políticas y complementos de registro
Situaciones adecuadas Si se necesita el entorno interactivo de la cuenta de destino Ejecutar un solo comando de administración o los permisos mínimos por rol

Los métodos de autenticación y el registro pueden variar según PAM y la política, por lo que la tabla anterior es una comparación general. Si solo se necesita un comando root, a menudo es más adecuado sudo, que puede limitar permisos por comando, en lugar de su, que comparte la contraseña de la cuenta. Para más detalles sobre cómo usarlo, consulte Comando sudo de Linux y configuración sudoers.

Razones por las que no se cambia a la cuenta root

La cuenta root puede estar bloqueada

Algunas distribuciones bloquean por defecto el inicio de sesión con la contraseña de root y usan la gestión a través de sudo. En este caso, la entrada de la contraseña del usuario actual en su - no funcionará.

Si el usuario tiene permisos sudo y la política lo permite, se puede abrir un shell root en forma de inicio de sesión como sigue, pero si solo se necesitan comandos individuales, es más seguro usar sudo COMANDO que un shell de administrador.

sudo -i

PAM o la política de grupo pueden restringirlo

La política de /etc/pam.d/su puede limitar el uso de su solo a grupos específicos o aplicar condiciones de autenticación adicionales. No debilite la configuración de PAM para obtener permisos; informe al administrador del sistema sobre las tareas necesarias y las cuentas objetivo.

Puede haber problemas con el estado de la cuenta objetivo

La transición puede fallar debido a la expiración de la cuenta, bloqueo, directorio de inicio incorrecto, shell restringido y permisos de archivos. Si es administrador, verifique la causa con getent passwd USUARIO, las herramientas de gestión de cuentas y los registros de autenticación.

Cuando root se ejecuta como otro usuario

Para la automatización, runuser puede ser más adecuado

El manual de util-linux ya recomienda runuser cuando se ejecuta como otro usuario desde un proceso con privilegios elevados o un script de root. runuser no es set-user-ID, no requiere autenticación de contraseña y usa una configuración PAM separada.

runuser -u backup -- /usr/local/bin/backup-job

runuser se utiliza desde un contexto administrativo de root; no permite que una cuenta normal obtenga privilegios por sí sola. backup y /usr/local/bin/backup-job deben ser una cuenta y un programa reales, con permisos revisados. No se crean mediante el ejemplo.

Si no se necesita una sesión PAM, vuelva a revisar el propósito

Si solo necesita cambiar los atributos de usuario/grupo y los permisos para ejecutar un programa y no se necesita una sesión PAM, util-linux también recomienda setpriv como alternativa. Esta herramienta maneja directamente los permisos y atributos de seguridad, por lo que solo debe ser usada por un administrador que entienda la configuración precisa de usuario, grupo, grupos suplementarios y capacidades.

Separar la sesión con un pseudoterminal

Separación proporcionada por --pty

--pty crea un pseudo-terminal separado entre la sesión original y la sesión de destino, y su retransmite la entrada y salida. Esto puede mejorar la seguridad al evitar que las dos sesiones compartan directamente el mismo terminal en una sesión interactiva.

su --pty --login deploy

No es una sesión completa de inicio de sesión de systemd

Incluso usando su --login, no se crea una sesión de inicio de sesión real completamente nueva desde la perspectiva de systemd-logind. Si se requiere trabajo que necesite servicios de usuario, asientos o límites de sesión, se debe considerar usar herramientas como systemd-run o machinectl según el propósito.

Precauciones de seguridad

  • No comparta la contraseña de root ni la contraseña de otros usuarios con varias personas.
  • No coloque contraseñas en la línea de comandos, historial del shell, scripts o tuberías.
  • No mantenga innecesariamente un shell root por mucho tiempo y salga con exit inmediatamente después de la tarea.
  • Inmediatamente después de la transición, verifique id, pwd y HOME para no confundir usuarios y rutas.
  • Revise primero las opciones, la ruta de destino y el resultado de la expansión de comodines para los comandos que se ejecutarán con privilegios elevados.
  • No suponga que se registra un log; verifique la configuración real y la política de retención de PAM, journal y logs de autenticación.

Cada comando ejecutado después de abrir un shell root con su es independiente de los registros de autenticación de su. Si se necesita auditoría de comandos individuales, se debe planificar un método combinado que incluya auditoría de shell, registro centralizado o políticas a nivel de comando como sudo.

Problemas comunes y soluciones

Síntomas Posibles causas Método de verificación
Authentication failure Contraseña incorrecta del objetivo, cuenta bloqueada o restricciones de PAM Verificación de la cuenta de destino, política de autenticación y logs
No se encuentra el comando después de la transición El PATH del usuario objetivo es diferente Verificar command -v y printf '%s\n' "$PATH"
El directorio de inicio no cambia Usar su USUARIO sin opción de inicio de sesión Usar su --login USUARIO
Las configuraciones del usuario parecen mezcladas Usar 'su' normal conservando parcialmente el entorno existente Verificar env, HOME, USER
La shell especificada no se ejecuta Shell restringida o restricción de permisos de llamada Verificar getent passwd y /etc/shells

Preguntas frecuentes

¿A quién se debe ingresar la contraseña en su?

Generalmente, se ingresa la contraseña del usuario al que se desea cambiar. Sin embargo, si lo ejecuta root o la política PAM utiliza otro método de autenticación, el funcionamiento puede ser diferente. Es normal que los caracteres no se muestren en la pantalla mientras se ingresa la contraseña.

¿Cuál es la diferencia entre su y su -?

su intenta ejecutar la shell de root conservando el directorio actual y parte del entorno. su - se mueve al home de root y configura el entorno de inicio de sesión. En util-linux, se recomienda el formato de inicio de sesión para reducir la mezcla de entornos.

Después de cambiar con su, ¿cómo se verifica el usuario actual?

id es útil para verificar juntos el usuario y el grupo reales y efectivos. Si solo se necesita el nombre de usuario simple, se puede usar whoami, pero para verificar incluso los grupos secundarios, id proporciona más información.

¿Puedo poner su contraseña en el script?

No incluya contraseñas en scripts: pueden quedar expuestas en archivos o registros. Para automatización iniciada por root, valore runuser; para una cuenta normal, diseñe reglas sudoers con privilegios mínimos o un servicio dedicado, sin incrustar contraseñas.

Resumen

El cambio de cuenta interactivo normal se puede ejecutar con su --login USUARIO, y un comando único con su -c 'COMANDO' USUARIO. Los su USUARIO simples pueden mezclar entornos, por lo que después de cambiar, es recomendable verificar id, HOME y pwd.

Si el objetivo es ejecutar un solo comando de root, sudo puede ser más adecuado, ya que proporciona control de permisos y auditoría por comando. Para automatización de root ejecutando como otros usuarios, revise runuser. Las herramientas básicas relacionadas se pueden consultar en Lista de comandos de uso frecuente en Linux.