Ejecute parte de un script bash como un usuario diferente


Respuestas:


42

Use el comando sudo en el script.

En la forma:

sudo -u username command

el comando sudo ejecuta el comando como nombre de usuario del usuario .

Si el script se ejecuta como root, no creo que solicite una contraseña. De lo contrario, este artículo analiza cómo usar sudo con contraseña en una línea de comando. , y este artículo analiza cómo usar sudo sin contraseña?


55
Esto es agradable y fácil, pero ¿hay alguna forma de hacerlo para un grupo de comandos en lugar de uno a la vez?
Andrew

escribir un script bash, hacerlo ejecutable chmod +x script.shy luego solosudo -u username script.sh
NiCU

@ Andrew Me preguntaba esto y lo siguiente funcionó para mí: sudo -u ic sh -c 'cmd1 && cmd2'
Karussell

Incluya también la iopción si desea adquirir el entorno del usuario
neoDev

6

Esta respuesta es buena, pero el consejo predeterminado del servidor es un poco peligroso: ¡permitiría a cualquiera ejecutar cualquier cosa como root! Así que estoy publicando aquí porque no puedo formatear el comentario.

Recomendaría usar visudo para otorgar los permisos que necesita con la mayor precisión posible. Escriba visudoy agregue una línea como:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

Si necesita ejecutar lo mismo en muchos hosts, puede abrirlo con:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

Pero ** no * usaría tampoco:

username ALL=(ALL) NOPASSWD: ALL

o nombre de usuario hostname = ALL

La página de manual de sudoer tiene muchos detalles sangrientos


¿Funcionaría para un comando disponible solo para un usuario en particular?
Manish Mathai

Puede especificar que solo usuarios particulares puedan ejecutar el comando (en los ejemplos anteriores, reemplace usernamecon el nombre de usuario que debería poder ejecutar el comando). Si el ejecutable que desea ejecutar solo es ejecutable por un usuario en particular, también está bien, simplemente pase ese nombre de usuario en la sudo -u username commandlinelínea del script.
James Polley el

@Manish. Sí. Lo que el archivo sudoers dice es "Permitir que este nombre de usuario en este host para ejecutar comando1 sin tener que proporcionar una contraseña.
DaveParillo

6

# I = me gusta:

#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# ./correr

1: root
2: nobody
3: root

10
¿Podría agregar algún texto explicativo?
Kazark

4

Para sonarqube:

sudo -u sonar /usr/bin/sonar start

donde sonares el nombre del usuario utilizado para ejecutar el comando/usr/bin/sonar start


2

no estoy tan seguro al respecto, pero si desea que SOLO el final de ese script se ejecute como un usuario diferente, puede agregar su someuserantes del final del script.

¿Me estoy perdiendo de algo?

Espero que ayude,

Saludos


1
Creo que esta es la respuesta más adecuada, ya que todas las demás respuestas sugieren sudo, que a menudo no se instala de manera predeterminada en algunas instalaciones mínimas de Linux.
Tim

1

De esta manera, el final de un script será ejecutado por un usuario diferente (root). Tenga en cuenta el $[LINENO+2]y las exit $?llamadas. Estos son necesarios para que el final del script se ejecute solo una vez y para preservar el código de salida de la sudollamada.

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.