Tengo un script que ejecuta tres funciones: A && B && C.
La función Bdebe ejecutarse como un superusuario, mientras que Ay Cno.
Tengo varias soluciones, pero ninguna de estas es satisfactoria:
- sudo el guión completo: - sudo 'A && B && C'- Parece una mala idea ejecutar - Ay- Ccomo superusuario si no es necesario
- hacer 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 - sudoprimero, 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

Ay . 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.Csu -l some_non_priviliged_usersudoRespuestas:
Creo que lo mejor que puede hacer es iniciar el script
sudoy luego iniciar los procesos que desea ejecutar como usuario normal explícitamente consu userosudo -u user:fuente
Agregue su secuencia de comandos al
/etc/sudoersarchivo con elNOPASSWDatributo, para que se pueda ejecutar sin solicitar una contraseña. Puede vincular esto a un usuario específico (o conjunto de usuarios), o permitir quesudocualquier persona en su sistema lo ejecute .Una línea de muestra para un script llamado
/usr/local/bin/bossypodría verse asíY luego usarías algo como esto
Para este ejemplo supuse
PATHincluye/usr/local/bin. Si no es así, simplemente use la ruta completa al script, es decirsudo /usr/local/bin/bossyfuente
Es posible que desee utilizar la
!requirettyopciónsudo, así como laNOPASSWDopción. Pero tenga en cuenta que esto reduce la seguridad.fuente
/etc/sudoersentrada para el usuario para ejecutar comandosBconNOPASSWDes 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_scripten el b ANTECEDENTES (porque-bse especificó) como root. Esto parece ser equivalente asudo sh -c "./B_script &".B_scriptcomienza a ejecutarse de forma asincrónica, en paralelo conABC_script.B_scriptprueba la existencia de un archivo llamadoA_is_doney realiza un bucle hasta que aparece.ABC_scriptcorreA. Si / cuandoAfinaliza con éxito, el script crea un archivo llamadoA_is_done.ABC_scriptluego prueba la existencia de un archivo llamadoB_is_doney realiza un bucle hasta que aparece.B_scriptdetecta la existencia deA_is_doney sale del bucle. Elimina elA_is_donearchivo y se ejecutaB. Recuerde,B_scriptse ejecuta como root, por lo que se ejecutaBcomo root. Si / cuandoBfinaliza con éxito, el script crea un archivo llamadoB_is_doney sale.ABC_scriptdetecta la existencia deB_is_doney sale del bucle. Borra elB_is_donearchivo. Recuerde, seB_scriptejecutó como root, por lo queB_is_donees propiedad de root, y desea usarlorm -fpara evitar recibir una solicitud de confirmación.ABC_scriptluego correCy sale.Notas para un mayor refinamiento:
ABC_scriptprobablemente debería ejecutarseB_scriptpor una ruta absoluta en lugar de./.A_is_doneyB_is_done,ABC_scriptprobablemente 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
Afalla, 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_donearchivos, 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 queAhaya terminado, y no quiere tener que esperar eso, o que el script lo espere.