Domanda

Nel mio caso devo eseguire openvpn prima di ssh'ing in un server e il comando openvpn ecosta "Sequenza di inizializzazione completata".

Allora, voglio il mio script configurare il openvpn e poi ssh in.

La mia domanda è: Come esegui un comando in bash in background e attendilo per echo "Completato" prima di eseguire un altro programma?

Il mio modo attuale di farlo è avere 2 riquadri terminali aperti, uno in esecuzione:

sudo openvpn --config FILE
.

E nell'altro che corro:

ssh SERVER
.

Una volta che il primo riquadro terminal mi ha mostrato il testo "Sequenza di inizializzazione completata".

È stato utile?

Soluzione

Sembra che tu voglia Esegui OpenVPN come processo in background durante l'elaborazione del suo stdoout in primo piano . < / P >.

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
.

Spiegazione

Leggiamolo a pezzi:

    .
  1. echo <(sudo openvpn --config FILE) stampierà qualcosa come /dev/fd63
      .
    • Il <(..) esegue openvpn in background e ...
    • Allega il suo stdoout a un descrittore di file, che viene stampato da echo
  2. exec 3< /dev/fd63
      .
    • (dove / dev / fd63 è il descrittore del file stampato dal punto 1)
    • Questo indica alla shell di aprire il descrittore del file ( / dev / fd63 ) per la lettura e ...
    • renderlo disponibile sul descrittore del file 3
  3. sed '/Initialization Sequence Completed$/q' <&3
      .
    • Ora corriamo sed in primo piano, ma renderlo letto dal descrittore del file 3 abbiamo appena aperto
    • non appena sed vede che la linea corrente termina con "sequenza di inizializzazione completata", si chiude (la parte / q )
  4. cat <&3 &
      .
    • openvpn continuerà a scrivere sul descrittore di file 3 e alla fine bloccano se nulla viene letto da esso
    • Per evitare che, corriamo cat sullo sfondo per leggere il resto dell'output
  5. L'idea di base è quella di eseguire openvpn sullo sfondo, ma catturare la sua uscita da qualche parte in modo che possiamo eseguire un comando in primo piano che bloccherà finché non legge le parole magiche, "Sequenza di inizializzazione completata". Il codice sopra tenta di farlo senza creare file temporanei disordinati, ma un modo più semplice potrebbe essere solo per utilizzare un file temporaneo.

Altri suggerimenti

Utilizzare -m 1 insieme con --line-buffered in Grep per terminare un grep dopo la prima corrispondenza in un flusso continuo.Questo dovrebbe funzionare:

sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top