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?

pcapademic
fuente
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

DaveParillo
fuente
¿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
Laboratorios AX
fuente
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

burtsevyg
fuente
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

dag729
fuente
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
dparalen
fuente