Tengo un script que ejecuta tres funciones: A && B && C
.
La función B
debe ejecutarse como un superusuario, mientras que A
y C
no.
Tengo varias soluciones, pero ninguna de estas es satisfactoria:
sudo el guión completo:
sudo 'A && B && C'
Parece una mala idea ejecutar
A
yC
como superusuario si no es necesariohacer el guión interactivo:
A && sudo B && C
Es posible que tenga que escribir mi contraseña, pero quiero que mi script no sea interactivo, ya que cada función puede tomar un tiempo, y no quiero que el script me espere. Bueno, esa es también la razón por la cual es un script en primer lugar, así que no tengo que verlo correr.
La estúpida solución:
sudo : && A && sudo -n B && C
Primero parece estúpido ejecutar un no-op
sudo
primero, y también debo cruzar el dedo para que A no vaya a tomar más que$sudo_timeout
.Solución hipotética (deseo que me digas que existe):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
Eso solicitaría mi contraseña al principio, y luego usaría esas credenciales solo cuando sea necesario.
¿Cuál es tu opinión sobre todo esto? Me sorprendería mucho que no haya una solución a ese problema, ya que creo que es un problema bastante común (¿qué pasa? make all && sudo make install
)
fuente
A
y . Sin problemas de tiempo de espera y sin privilegios para A y C. No creo que 4 sea posible, parece un "estado global" para un usuario.C
su -l some_non_priviliged_user
sudo
Respuestas:
Creo que lo mejor que puede hacer es iniciar el script
sudo
y luego iniciar los procesos que desea ejecutar como usuario normal explícitamente consu user
osudo -u user
:fuente
Agregue su secuencia de comandos al
/etc/sudoers
archivo con elNOPASSWD
atributo, para que se pueda ejecutar sin solicitar una contraseña. Puede vincular esto a un usuario específico (o conjunto de usuarios), o permitir quesudo
cualquier persona en su sistema lo ejecute .Una línea de muestra para un script llamado
/usr/local/bin/bossy
podría verse asíY luego usarías algo como esto
Para este ejemplo supuse
PATH
incluye/usr/local/bin
. Si no es así, simplemente use la ruta completa al script, es decirsudo /usr/local/bin/bossy
fuente
Es posible que desee utilizar la
!requiretty
opciónsudo
, así como laNOPASSWD
opción. Pero tenga en cuenta que esto reduce la seguridad.fuente
/etc/sudoers
entrada para el usuario para ejecutar comandosB
conNOPASSWD
es la respuesta correcta.¿Aprovechando mi respuesta para preautorizar sudo? (Para que pueda ejecutarse más tarde) , escriba dos scripts:
ABC_script
:B_script
:Ejecutar
./ABC_script
:sudo -b ./B_script
. Esto solicita la contraseña ( inmediatamente después de ejecutarABC_script
). Suponiendo que se introduzca la contraseña correcta, se generaB_script
en el b ANTECEDENTES (porque-b
se especificó) como root. Esto parece ser equivalente asudo sh -c "./B_script &"
.B_script
comienza a ejecutarse de forma asincrónica, en paralelo conABC_script
.B_script
prueba la existencia de un archivo llamadoA_is_done
y realiza un bucle hasta que aparece.ABC_script
correA
. Si / cuandoA
finaliza con éxito, el script crea un archivo llamadoA_is_done
.ABC_script
luego prueba la existencia de un archivo llamadoB_is_done
y realiza un bucle hasta que aparece.B_script
detecta la existencia deA_is_done
y sale del bucle. Elimina elA_is_done
archivo y se ejecutaB
. Recuerde,B_script
se ejecuta como root, por lo que se ejecutaB
como root. Si / cuandoB
finaliza con éxito, el script crea un archivo llamadoB_is_done
y sale.ABC_script
detecta la existencia deB_is_done
y sale del bucle. Borra elB_is_done
archivo. Recuerde, seB_script
ejecutó como root, por lo queB_is_done
es propiedad de root, y desea usarlorm -f
para evitar recibir una solicitud de confirmación.ABC_script
luego correC
y sale.Notas para un mayor refinamiento:
ABC_script
probablemente debería ejecutarseB_script
por una ruta absoluta en lugar de./
.A_is_done
yB_is_done
,ABC_script
probablemente debería generar nombres de archivo únicos y aleatorios.Es necesario que haya una provisión para el script que está en espera de ser notificado si el programa que está esperando ha finalizado pero ha fallado. (En este momento, si
A
falla, ambos scripts simplemente entran en un ciclo de espera infinito). Esto podría ser tan simple como cambiara
y luego modificando los spin-waits para leer los
X_is_done
archivos, y proceder si contiene 0 y salir de lo contrario.fuente
Se tonto Usa muchas líneas.
fuente
&&
A && sudo B && C
. Tal como Antoine explica en la pregunta; esto no pide la contraseña hasta queA
haya terminado, y no quiere tener que esperar eso, o que el script lo espere.