¿Qué hace el comando 'sudo -s' y cómo se usa en este ejemplo?

8

Tengo la siguiente duda. En un tutorial relacionado con una instalación de software que estoy siguiendo, digo que tengo que ejecutar los siguientes comandos (lo estoy haciendo en un shell ssh , por lo que esta lista de pasos termina con el exitcomando):

sudo -s
apt-get update
apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen
exit

Mis dudas son:

¿Qué hace exactamente el -sparámetro después del sudocomando?

Buscando en la web encontré que:

‑S [comando] La opción ‑s (shell) ejecuta el shell especificado por la variable de entorno SHELL si está configurado o el shell según lo especificado en la base de datos de contraseñas. Si se especifica un comando, se pasa al shell para su ejecución a través de la opción -c del shell. Si no se especifica ningún comando, se ejecuta un shell interactivo

Me parece que sudo -sejecuta un comando usando la variable de entorno del shell.

Pero esto no está claro para mí: en este caso, ¿cuál es el comando ejecutado con la variable de entorno? (solo se ejecuta sudo -sy no sudo -s [command]).

AndreaNobili
fuente

Respuestas:

7

La respuesta simple es que te da un shell de raíz. Para eso se usa aquí. Hay una buena comparación entre la técnica su, sudo -i, sudo -sy sudo sumétodos en Unix.SE pero eso no es realmente relevante aquí. El código podría haber usado cualquiera y habría funcionado.

La pepita de ayuda significa algunas cosas:

  • Está buscando un comando en la $SHELLvariable de entorno. Si corres echo $SHELL, probablemente verás /bin/bash. Eso significa que obtendrá una instancia raíz de Bash. Estoy seguro de que si estuvieras en zshél, significaría que obtienes una instancia raíz de zsh.

  • Si $SHELLestá vacío, vuelve al shell predeterminado definido /etc/passwdpara ese usuario.

  • Si proporciona un comando (por ejemplo sudo -s whoami), en realidad se está ejecutando:sudo /bin/bash -c "whoami"

  • Si no pasa un comando, no pasa un -cargumento, por lo que solo obtiene un shell interactivo.

He usado la frase "root" varias veces. Por defecto, sudo se trata de ejecutar cosas como root, pero sudo(y su) puede ejecutar cosas como otros usuarios (si tiene permiso para hacerlo). Solo estoy diciendo esto para los pedantes que gritarán que sudo -s -u $USERno les da un caparazón de raíz como prometí -santeriormente.


Y en mi opinión más humilde , es realmente tonto convertirse en root para solo dos comandos, sin mencionar que podría dejar a un usuario ejecutando accidentalmente más comandos como root. Si desea o necesita ejecutar algo como root, solo preforme el comando con sudo:

sudo apt-get update
sudo apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen

Dudaría de cualquier tutorial que sugiriera obtener un shell raíz, excepto en los casos en los que tiene un montón de comandos para ejecutar ... E incluso entonces, hay secuencias de comandos.

Oli
fuente
Explicación perfecta Ahora está todo más claro. Una última duda. Si presento sudo a todos los comandos anteriores, ¿obtendré el mismo resultado final? ¿Es verdad o me estoy perdiendo algo?
AndreaNobili
@Oli tiene 100% de razón acerca de Zsh, "sudo -s" inicia sesión en un shell "root" como "root", no como Super User.
RCF
@AndreaNobili Sí, para eso sudoes generalmente; ejecutar un comando como root sin tener que iniciar sesión manualmente como root.
Oli
Para su información, publiqué una respuesta debajo de la suya y mi opinión sudo -ses drásticamente diferente debido a mi conocimiento limitado y a que sucedió en la situación por accidente. Aún así, es posible que desee leer mi respuesta "humilde" y posiblemente actualizar su respuesta de 1/2 década de antigüedad.
WinEunuuchs2Unix
0

sudo -sejecutará un comando en el directorio actual como lo haría un usuario normal. Por ejemplo:

rick@alien:~/askubuntu$ suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
Nov 12 22:23:37 to Nov 13 04:24:37 lasting 21,660 seconds
(... SNIP ...)
Dec 02 21:58:49 to Dec 03 04:20:52 lasting 22,923 seconds
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,356 seconds (21 days, 12 hours, 29 minutes, 16 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,015 seconds (7 days, 22 hours, 33 minutes, 35 seconds)

rick@alien:~/askubuntu$ sudo suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -H suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -s suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
(...SNIP...)
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,431 seconds (21 days, 12 hours, 30 minutes, 31 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,090 seconds (7 days, 22 hours, 34 minutes, 50 seconds)

Por supuesto, usar en -slugar de prefijar el comando con ./puede no ser un gran ahorro de tiempo.

WinEunuuchs2Unix
fuente