su vs sudo -s vs sudo -i vs sudo bash

89

¿Cuál es la diferencia entre los siguientes comandos:

su
sudo -s
sudo -i
sudo bash

suque necesito saber la contraseña de root y sudotengo que estar en el sudoersarchivo, pero una vez ejecutado, ¿cuál es la diferencia?

Sé que hay una diferencia entre suy sudo -sporque mi directorio de inicio está /rootdespués de ejecutar su, pero mi directorio de inicio sigue /home/mynamedespués sudo -s. Pero sospecho que esto es solo un síntoma de una diferencia subyacente que me falta.

Snitse
fuente
3
Prefiero usar De sudo su - esta manera, no necesita la contraseña de root, y -se asegura de que el directorio de inicio esté configurado correctamente.
Jens Timmerman el

Respuestas:

114

Con su, te conviertes en otro usuario: root de forma predeterminada, pero potencialmente otro usuario. Si dice su -, su entorno también se reemplaza con el entorno de inicio de sesión de ese usuario, de modo que lo que ve es indistinguible de iniciar sesión como ese usuario. No hay forma de que el sistema pueda decir lo que usted hace mientras se sudirige a otro usuario de las acciones de ese usuario cuando inician sesión.

Las cosas son muy diferentes con sudo:

  • Los comandos que ejecuta se sudo ejecutan como el usuario objetivo (raíz de forma predeterminada, pero se puede cambiar con) -u, pero registra los comandos que ejecuta a través de ellos, etiquetándolos con su nombre de usuario para que luego se pueda asignar la culpa. :)

  • sudoEs muy flexible. Puede limitar los comandos que puede ejecutar un determinado usuario o grupo de usuarios, por ejemplo. Con sutodo o nada.

    Esta característica se usa generalmente para definir roles. Por ejemplo, podría definir un grupo de "copias de seguridad" que se permita ejecutar dumpy tar, cada uno de los cuales necesita acceso raíz para realizar una copia de seguridad adecuada del disco del sistema.

    Menciono esto aquí porque significa que puedes otorgarle sudoprivilegios a alguien sin darles sudo -sni sudo bashhabilidades. Solo tienen los permisos que necesitan para hacer su trabajo, mientras que con suel sistema completo. Sin embargo, debes tener cuidado con esto: si le das a alguien la capacidad de decir sudo vi, por ejemplo, puede pagar viy tener efectivamente el mismo poder que con sudo -s.

  • Debido a que toma la contraseña del sudoer en lugar de la contraseña de root, sudoaísla el permiso entre múltiples sudoers.

    Esto resuelve un problema administrativo con su, que es que cuando la contraseña de root cambia, todos los que tenían que saber usarla sutenían que ser informados. sudopermite que las contraseñas de los sudoers cambien independientemente. De hecho, es común bloquear con contraseña la cuenta del usuario root en un sistema sudopara forzar que todas las tareas de sysadmin se realicen a través de sudo. En una organización grande con muchos sudoers de confianza, esto significa que cuando uno de los administradores del sistema se va, no tiene que cambiar la contraseña de root y distribuirla a los administradores que permanecen.

La principal diferencia entre sudo bashy sudo -ses que -ses más corta y le permite pasar comandos para ejecutar en el shell predeterminado de su usuario de dos maneras:

  1. Puedes decir sudo -s some-commandcuál corre some-commandbajo tu caparazón. Básicamente es una forma abreviada de sudo $SHELL -c some-command.

  2. En su lugar, puede pasar los comandos a la entrada estándar del shell, como sudo -s < my-shell-script. Puede usar esto con un heredoc para enviar varios comandos a una sola sudollamada, evitando la necesidad de escribir sudorepetidamente.

Ambos comportamientos son opcionales. Mucho más comúnmente, das -ssolo, por lo que solo ejecuta el shell de tu usuario de forma interactiva. En ese modo, difiere de sudo bashque podría ejecutar un shell diferente al bash, ya que se ve primero en la SHELLvariable de entorno y luego, si no está configurado, en la configuración del shell de inicio de sesión de su usuario, generalmente en /etc/passwd.

El shell ejecutado por sudo -shereda su entorno de usuario actual. Si lo que realmente quieres es un entorno limpio, como el que obtienes justo después de iniciar sesión, lo que quieres es sudo -iuna adición relativamente reciente a sudo. En términos generales, sudo -ies sudo -scomo su -es su: restablece todas las variables de entorno clave, excepto algunas, y lo envía de vuelta al directorio de inicio de su usuario. Si no le da comandos para que se ejecute bajo ese shell a través de una entrada estándar o sudo -i some-command, ejecutará ese shell como un shell de inicio de sesión interactivo, de modo que los scripts de inicio del shell de su usuario (por ejemplo .bash_profile) se ejecuten nuevamente.

Todo esto hace que sea sudo -imucho más seguro que sudo -s. ¿Por qué? Porque si alguien puede modificar su entorno antes sudo -s, podría provocar que se ejecuten comandos no deseados. El caso más obvio es la modificación SHELL, pero también puede ocurrir de manera menos directa, como a través de PAGERsi dices man foomientras estás debajo sudo -s.

Podría decir: "Si pueden modificar PAGER, pueden modificar PATH, y luego pueden simplemente sustituir un sudoprograma maligno ", pero alguien lo suficientemente paranoico puede decir /usr/bin/sudo /bin/bashpara evitar esa trampa. Sin embargo, probablemente no seas tan paranoico como para evitar las trampas en todas las demás variables de entorno susceptibles. ¿También recordó verificar EDITOR, por ejemplo, antes de ejecutar cualquier comando VCS ? Por lo tanto sudo -i.

Debido a que sudo -itambién cambia su directorio de trabajo al directorio de inicio de su usuario, es posible que aún desee utilizarlo sudo -spara aquellas situaciones en las que sabe que desea permanecer en el mismo directorio en el que estaba cdcuando corrió sudo. Es todavía más seguro sudo -iy cdvolver a donde estaba, sin embargo.

Warren Young
fuente
2
¿Qué quieres decir con 'shell out of vi'?
crisron
11
@crisron: desde dentro vi, escribe :shy presiona Enter. Ahora estás en un sub-shell, con todos los privilegios del viproceso que generó ese shell. Si vise ejecuta con privilegios de root, también lo hará el shell. O bien, puede ejecutar algo más que un shell a través de :!cmd, leer la salida de un comando en el búfer de edición a través de :r !cmd, etc. Si todos están bloqueados, los Makefiledestinos son scripts de shell y Vim tiene el :makecomando, que efectivamente le permite ejecutar shell arbitrario guiones desde dentro del editor. Las posibilidades de travesuras son demasiado inmensas para que este cuadro de comentarios se mantenga.
Warren Young
2
si alguien puede poner un falso en bash en tu PATH, entonces ese alguien puede poner un sudo falso en tu PATH. para estar realmente seguro de que tienes que invocar sudo usando la ruta completa:/usr/bin/sudo
lesmana
1
@lesmana: lo he abordado en una edición; Básicamente, el PATHno es el único problema.
Warren Young
66
Gran explicación Gran dolor de cabeza al leerlo.
lobi
27

Desde una publicación de ubuntuforums que hice hace un tiempo:

Considere el siguiente experimento:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

Aquí están las diferencias que encontré:

Con sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

Con sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Nótese la diferencia en $HOME. Ser root y haberse $HOMEestablecido en el hogar del usuario normal puede causar problemas. Por ejemplo, si ejecuta una aplicación gráfica, el usuario normal ~/.Xauthoritypuede sobrescribirse por root. Esto causa los problemas normales del usuario más adelante, como no poder ejecutar ciertas aplicaciones gráficas a través de cron.

Para resumir:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games probablemente establecido por /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

El resultado final sudo -ies el comando apropiado para ejecutar cuando desea un shell raíz que no esté contaminado por el entorno del usuario.

unutbu
fuente
1
La cantidad de "contaminación" del entorno también depende de la configuración de sudo(en /etc/sudoersy archivos relacionados). Los valores de configuración, tales como always_set_home, env_reset, env_keep, env_checky env_reset, y estos pueden variar dependiendo del usuario y el mando. Consulte la sección 'Entorno de comando' y OPCIONES DE SUDOERS de la página de manual de sudoers (5) .
Curt J. Sampson
Personalmente, elijo sudo -Hscuando quiero un entorno no contaminado por mi configuración, porque uso zsh y todas las cuentas de aplicaciones que podría estar cambiando para usar bash. Esto permite que una cierta cantidad de variables de entorno pasen sin ser molestadas, pero normalmente encuentro que /etc/profile.d/* sobrescribe las que importan.
Ed Grimm
7

su( s witch u ser o s ubstitute u ser) le permite cambiar de usuario. subásicamente inicia otra instancia de shell con los privilegios del usuario deseado. De forma predeterminada, lo cambia al rootusuario, si queremos cambiar un usuario específico, necesitamos pasar al usuario de la siguiente manera:

$ su bob  # switches to bob (requires bob's password)

su -significa que las variables de entorno se restablecerán a la raíz y sulas variables de entorno como usuario anterior.

por ejemplo: el directorio de inicio de root si lo usa su -o el directorio de inicio de usuario antiguo si lo usa su.

sudo ( s uper u ser do ) es una utilidad de línea de comandos que permite a los usuarios ejecutar programas con los privilegios de seguridad de otro usuario, por defecto es superusuario, es decir root. Utiliza un archivo de configuración /etc/sudoersque enumera qué usuarios tienen derechos para acciones específicas

sudo debe leerse como / ˈsuːduː / . sintaxis, sudo commandes decir, s witch u ser y hacer este comando.

  • sues equivalente sudo -iy simula un inicio de sesión en la cuenta raíz. Su directorio de trabajo será /root, y leerá la raíz, .profileetc. La solicitud cambiará de $ a #, lo que indica que tiene acceso a la raíz.

  • sudo -s lanza un shell como root, pero no cambia su directorio de trabajo.

  • sudo bash donde bashes el comando para ejecutar sudo. Este comando se ejecuta bashcomo un superusuario.

  • El uso sudose puede registrar todo lo que alguien hace.
  • El uso sudoevita que un usuario tenga que conocer la contraseña de root.
  • Usando sudopodemos limitar los comandos se les permite ejecutar.
Premraj
fuente