Revisa un script de shell antes de ejecutar

Tengo un script de shell ( arch-chroot del package Arch arch-install-scripts ) que maneja el assembly y desassembly de dispositivos (con comprobación de errores) antes de iniciar un chroot . Comienza el chroot en la línea final con:

 SHELL=/bin/sh unshare --fork --pid chroot "$chrootdir" "$@" 

Para mi caso de uso, me gustaría usar el mismo script con un "parche" en la línea final

 SHELL=/bin/bash chroot "$chrootdir" "$@" 

¿Cuál es la mejor manera de hacer esto? Si es importante, la secuencia de commands arch-chroot debe ejecutarse con privilegios de administrador. En este momento solo tengo una copy parcheada del guion. Si el script original se actualiza, entonces mi versión parchada estará "desactualizada". Estaba pensando que podría hacer la copy y el parche, según sea necesario, en un lugar temporal, pero no estoy seguro si eso es mejor.

¿Hay alguna manera de parchear temporalmente un script en el lugar?

El script original solo cambiará cuando se actualice el package al que pertenece. Mi objective es mantener el guión original sin cambios, pero tengo una forma de llamar a una versión parcheada de la versión más reciente del guión original.

Una solución simple y grosera sería escribir un pequeño script que crea un file temporal con la copy modificada del arch-chroot original y luego ejecuta el file tmp. Por ejemplo:

 #!/bin/sh scriptfile=$(mktemp /tmp/tempscript.XXXXX) sed 's#SHELL=.*#SHELL=/bin/bash chroot "$chrootdir" "$@"#' /usr/bin/arch-chroot > $scriptfile $scriptfile "$@" 

Tenga en count que esto supone que solo hay una línea que coincida con la cadena SHELL= en /usr/bin/arch-chroot y fallará en silencio si hay más o ninguna.

si el script que está utilizando se proporciona en la distribución del sistema operativo, las posibilidades de que se actualice son muy altas. Sugeriría, escribes un guión de envoltura alnetworkingedor de este original, que cortará la última línea del guión original y agregará tu línea personalizada hasta el final. Luego llama a la copy recién creada. Es la forma más simple en mi opinión.

 mv original_script original_script.orig # make a backup copy of original sed -i '$ d' original_script.orig > original_script # remove last line echo 'SHELL=/bin/bash chroot "$chrootdir" "$@"' >> original_script # add your line to the end original_script # run the script mv original_script.orig original_script #restre the original in place 

Crea tu propio package modificado para esto. Tenga cuidado de mantenerlo actualizado, y tal vez use algún truco específico de distribución para evitar actualizarlo automáticamente.

No entiendo la razón del cambio que propones (sin ningún conocimiento de Arch), pero a primera vista es algo que no deberías hacer por razones de security, o tal vez tu caso de uso es lo suficientemente relevante como para garantizar que un parche de aguas arriba habilite esto de alguna manera En cualquier caso, sugiero que lo hablen con personas conocedoras, a través del sistema de request / mejora de errores para su distribución.

O discuta aquí lo que quiere lograr (no cómo está tratando de llegar allí, como lo hace esta pregunta).