Ejecute parte de un script bash como un usuario diferente
33
¿Hay alguna manera de hacer que parte de un script se ejecute como un usuario diferente (no root)? Si ayuda, la parte que se ejecutará como un usuario diferente se produce al final del script
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:
¿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
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.
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
Respuestas:
Use el comando sudo en el script.
En la forma:
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?
fuente
chmod +x script.sh
y luego solosudo -u username script.sh
i
opción si desea adquirir el entorno del usuarioEsta 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
visudo
y agregue una línea como:Si necesita ejecutar lo mismo en muchos hosts, puede abrirlo con:
Pero ** no * usaría tampoco:
o nombre de usuario hostname = ALL
La página de manual de sudoer tiene muchos detalles sangrientos
fuente
username
con 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 lasudo -u username commandline
línea del script.# I = me gusta:
# ./correr
fuente
Para sonarqube:
sudo -u sonar /usr/bin/sonar start
donde
sonar
es el nombre del usuario utilizado para ejecutar el comando/usr/bin/sonar start
fuente
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 someuser
antes del final del script.¿Me estoy perdiendo de algo?
Espero que ayude,
Saludos
fuente
De esta manera, el final de un script será ejecutado por un usuario diferente (root). Tenga en cuenta el
$[LINENO+2]
y lasexit $?
llamadas. Estos son necesarios para que el final del script se ejecute solo una vez y para preservar el código de salida de lasudo
llamada.fuente