Pregunta

En mi caso tengo que correr openvpn antes de ingresar a un servidor, y el openvpn El comando repite "Secuencia de inicialización completada".

Entonces, quiero que mi script configure el openvpn y luego ingresa ssh.

Mi pregunta es:¿Cómo se ejecuta un comando en bash en segundo plano y se espera que diga "completado" antes de ejecutar otro programa?

Mi forma actual de hacer esto es tener 2 paneles de terminal abiertos, uno ejecutando:

sudo openvpn --config FILE

y en el otro corro:

ssh SERVER

una vez que el primer panel de terminal me mostró el texto "Secuencia de inicialización completada".

¿Fue útil?

Solución

Parece que quieres ejecute openvpn como un proceso en segundo plano mientras procesa su salida estándar en primer plano.

exec 3< <(sudo openvpn --config FILE)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
# VPN initialization is now complete and running in the background
ssh SERVER

Explicación

Rompamoslo en pedazos:

  1. echo <(sudo openvpn --config FILE) imprimirá algo como /dev/fd63
    • el <(..) carreras openvpn en el fondo y...
    • adjunta su salida estándar a un descriptor de archivo, que se imprime mediante echo
  2. exec 3< /dev/fd63
    • (dónde /dev/fd63 es el descriptor de archivo impreso desde el paso 1)
    • esto le dice al shell que abra el descriptor de archivo (/dev/fd63) para leer, y...
    • ponerlo a disposición en el descriptor de archivo 3
  3. sed '/Initialization Sequence Completed$/q' <&3
    • ahora corremos sed en primer plano, pero haz que se lea desde el descriptor del archivo 3 acabamos de abrir
    • tan pronto como sed ve que la línea actual termina con "Secuencia de inicialización completada", sale (el /q parte)
  4. cat <&3 &
    • openvpn Seguirá escribiendo en el descriptor del archivo. 3 y eventualmente bloquear si no se lee nada
    • para evitar eso, corremos gato en segundo plano para leer el resto de la salida

La idea básica es ejecutar openvpn en segundo plano, pero captura su salida en algún lugar para que podamos ejecutar un comando en primer plano que se bloqueará hasta que lea las palabras mágicas "Secuencia de inicialización completada".El código anterior intenta hacerlo sin crear archivos temporales desordenados, pero una forma más sencilla podría ser simplemente utilizar un archivo temporal.

Otros consejos

Usar -m 1 Juntos con --line-buffered en grep para finalizar un grep después de la primera coincidencia en una secuencia continua.Esto debería funcionar:

sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top