Pergunta

No meu caso, eu tenho que correr openvpn antes de ssh ing em um servidor, e o openvpn comando ecos fora "Seqüência de Inicialização Concluída".

Então, eu quero o meu script para a instalação openvpn e, em seguida, o ssh.

A minha pergunta é:Como você executar um comando no bash no plano de fundo e aguardam para echo "concluído" antes de executar outro programa?

Minha atual forma de fazer isso é ter de terminal de 2 painéis abertos, um em execução:

sudo openvpn --config FILE

e no outro eu executar:

ssh SERVER

uma vez que o primeiro terminal painel mostrou-me a "Seqüência de Inicialização Concluída" de texto.

Foi útil?

Solução

Parece que você quer executar o openvpn como um processo em segundo plano durante o processamento de seu stdout em primeiro 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

Explicação

Vamos quebrá-lo em pedaços:

  1. echo <(sudo openvpn --config FILE) irá imprimir algo como /dev/fd63
    • o <(..) corre openvpn no fundo, e...
    • anexa a sua stdout para um arquivo descritor, que é impresso pela echo
  2. exec 3< /dev/fd63
    • (onde /dev/fd63 é o descritor de arquivo impresso a partir do passo 1)
    • isso informa ao shell para abrir o arquivo descritor (/dev/fd63) para a leitura, e...
    • torná-lo disponível no arquivo de descritor de 3
  3. sed '/Initialization Sequence Completed$/q' <&3
    • agora estamos sed em primeiro plano, mas fazer com que ele leia do arquivo de descritor de 3 que acabou de abrir
    • assim que sed vê-se que a atual linha termina com "Seqüência de Inicialização Concluída", ele fecha (o /q parte)
  4. cat <&3 &
    • openvpn vai continuar a escrever para o arquivo de descritor de 3 e, eventualmente, bloquear, se nada lê-lo
    • para evitar isso, execute as gato no plano de fundo para ler o resto da saída

A idéia básica é executar openvpn no plano de fundo, mas a captura de sua saída em algum lugar para que possamos executar um comando em primeiro plano que irá bloquear até que ele lê as palavras mágicas, "Seqüência de Inicialização Concluída".O código acima tenta fazê-lo sem criar confuso arquivos temporários, mas de uma maneira mais simples, pode ser apenas para usar um arquivo temporário.

Outras dicas

Utilização -m 1 em conjunto com --line-buffered em grep para terminar um grep após a primeira partida, em um fluxo contínuo.Isso deve funcionar:

sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top