'sudo su -' frente a 'sudo -i' frente a 'sudo / bin / bash': ¿cuándo importa cuál se utiliza o si es importante?

254

Cuando estoy haciendo algo que requiere que la raíz se escriba decenas de veces seguidas, prefiero cambiar mi sesión a una sesión raíz. En los diversos tutoriales e instrucciones que he utilizado en Internet, veo sudo su, sudo su -, sudo -iy sudo /bin/bashse utiliza para abrir una sesión de raíz, pero no estoy claro sobre la diferencia entre estos y cuándo o si lo que importa de diferencia.

¿Alguien puede aclarar esto por mí?

Pablo
fuente
11
Olvidaste preguntar sobre sudo -sy sudo su.
Radu Rădeanu
3
@ RaduRădeanu Cuando escribí la pregunta, revisé las preguntas sugeridas y ninguna de ellas realmente respondió mi pregunta completa. Lo mismo es cierto para las preguntas a las que se vinculó. Aunque contienen mucha información nueva para mí, y gracias por vincularlos, encontré que no son tan completos como la respuesta que proporciona el caos a continuación, que está mucho más en línea con lo que estaba buscando.
Paul

Respuestas:

325

Para explicar esto, necesita saber qué hacen los programas:

  • su- El comando suse usa para cambiar a otro usuario ( s witch u ser), pero también puede cambiar al usuario raíz invocando el comando sin ningún parámetro. sule pide la contraseña del usuario para cambiar, después de escribir la contraseña que cambió al entorno del usuario.
  • sudo- sudoestá destinado a ejecutar un solo comando con privilegios de root. Pero a diferencia de suesto, le solicita la contraseña del usuario actual. Este usuario debe estar en el archivo sudoers (o en un grupo que esté en el archivo sudoers). De forma predeterminada, Ubuntu "recuerda" su contraseña durante 15 minutos, para que no tenga que escribirla cada vez.
  • bash- Una interfaz de texto para interactuar con la computadora. Es importante comprender la diferencia entre inicio de sesión, no inicio de sesión, shells interactivos y no interactivos:

Tipos de conchas:

  • shell de inicio de sesión : un shell de inicio de sesión lo conecta al sistema como un usuario específico, necesario para esto es un nombre de usuario y contraseña. Cuando presiona ctrl+ alt+ F1para iniciar sesión en un terminal virtual, obtiene después de iniciar sesión correctamente un shell de inicio de sesión.
  • shell sin inicio de sesión : un shell que se ejecuta sin iniciar sesión, necesario para esto es un usuario actualmente conectado. Cuando abre una terminal gráfica en gnome, es un shell que no inicia sesión.
  • shell interactivo : un shell (inicio o no inicio de sesión) donde puede escribir o interrumpir comandos de forma interactiva. Por ejemplo, un terminal de gnomo.
  • shell no interactivo : un (sub) shell que probablemente se ejecuta desde un proceso automatizado. No verá ni entrada ni salida.

Entonces los casos son:

  • sudo suLlamadas sudocon el comando su. Bash se llama como shell interactivo sin inicio de sesión. Entonces bash solo se ejecuta .bashrc. Puede ver que después de cambiar a root todavía está en el mismo directorio:

    user@host:~$ sudo su
    root@host:/home/user#
  • sudo su -Esta vez se trata de un shell de entrada, por lo que /etc/profile, .profiley .bashrcse ejecutan y se encontrará en el directorio inicial de la raíz con el medio ambiente de la raíz.

  • sudo -iEs casi lo mismo que la sudo su -opción -i (simular inicio de sesión inicial) ejecuta el shell especificado por la entrada de la base de datos de contraseñas del usuario objetivo como un shell de inicio de sesión. Esto significa que los archivos de recursos específicos de inicio de sesión como .profile, .bashrco .loginserán leídos y ejecutados por el shell.

  • sudo /bin/bashEsto significa que llamas sudocon el comando /bin/bash. /bin/bashse inicia como un shell sin inicio de sesión, por lo que no se ejecutan todos los archivos de puntos, sino que bash mismo lee .bashrcal usuario que llama. Tu entorno permanece igual. Su hogar no será el hogar de la raíz. Entonces eres root, pero en el entorno del usuario que llama.

  • sudo -slee la $SHELLvariable y ejecuta el contenido. Si lo $SHELLcontiene /bin/bash, invoca sudo /bin/bash(ver arriba).

Cheque:

Para verificar si está en un shell de inicio de sesión o no (funciona solo en bash porque shoptes un comando incorporado):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
caos
fuente
18
Solo una aclaración: sudopermite a un usuario permitido ejecutar un comando como superusuario u otro usuario . De todos modos, +1 por tu esfuerzo.
Radu Rădeanu
2
@chaos ¡Gracias por esta excelente respuesta! Principalmente responde a mis preguntas, así que seguí adelante y marqué la pregunta como respondida, pero no entiendo cuándo es deseable ejecutar un shell en particular. Realmente solo uso Ubuntu a través de la línea de comandos y creo que mi uso más común para abrir una rootsesión de usuario (en lugar de usar sudo) es cuando estoy haciendo algo que requiere un uso intensivo de rootprivilegios, como cuando instalo algo nuevo o realizo una reconfiguración importante . He estado usando sudo /bin/bash, pero aparentemente ese método tiene una mala reputación por alguna razón que no entiendo.
Paul
2
Además, es más "correcto" decir que su significa cambiar de usuario, en lugar de superusuario. Es decir, ejecutar un script php: su www-data /usr/share/script.php o simplemente su www-data para shell interactivo. Pero su sin ningún nombre de usuario asumirá la cuenta raíz (superusuario).
olvido
Caos - "shopt -q login_shell && echo 'Shell de inicio de sesión' || echo 'Sin shell de inicio de sesión'" Este tipo de sugerencias que veo a menudo, pero ¿por qué hacerlo tan largo? El operador && significa que si el código de salida 0 es "hacer el siguiente comando" y las dobles líneas (||) significan lo contrario (si no es 0), entonces ejecute este comando. Entonces, ¿qué está diciendo básicamente si el código de salida 0 entonces repite "Shell de inicio de sesión", si el código de salida 1 (falla) entonces repite "Sin inicio de sesión". ¿Por qué no simplemente "shopt -q login_shell; echo $?" PS significa el código de resultado / salida del comando anterior. En la mayoría, si no todos los programas 0 significa éxito, 1 o más significa fracaso. Entonces, si el eco es 0 = éxito ...
olvido
2
@Paul: sudo -ise sugiere. Lea aquí: ubuntuforums.org/showthread.php?t=1817402 y aquí: unix.stackexchange.com/questions/98531/…
Marco Sulla
0

Para buscar diferencias, puede controlar el entorno resultante entre las diferentes invocaciones.

Puede encontrar algunas diferencias "pequeñas" en algunas variables críticas:

  • PATH` LD_LIBRARY_PATH`LD_PRELOAD

o alguna diferencia en ~ /. manejo de archivos de puntos ( ~/.config).

Considere también la propiedad de los archivos de registro basados ​​en $ HOME ( ~/.xsession.errors, etc.) o las cookies xauth ( ~/.Xauthority) que generan los comandos.

Pruebe estos comandos:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)

hute37
fuente