STDOUT e redirecionamento STDERR para nc

3

Eu estou tentando fazer um script bash watchdog que tem que verificar se a porta está aberta, com base no status de saída, caso contrário, deve iniciar o daemon. O problema é que não consigo evitar que o script envie qualquer informação redirecionando STDOUT e STDERR.

nc -zv 1.2.3.4 55 | grep " open " >/dev/null 2>&1

ou

nc -zv 1.2.3.4 55 | grep " open " 2>&1 >/dev/null

ou

nc -zv 1.2.3.4 55 | grep " open " &>/dev/null

retorna mesmo assim

'FQDN_hostname_or_domainname [1.2.3.4] 55 (?) open'

No entanto, essa combinação funciona com outros comandos, como netstat . É algo sobre netcat, ou talvez sobre a sintaxe bash? Por favor, deixe-me saber o que estou errado.

    
por Ricardo Beschieru 20.06.2016 / 18:09

2 respostas

5

O problema não tem nada a ver com nc ou netcat ou qualquer um deles. Você está executando dois comandos aqui, nc e grep , mas apenas redirecionando a saída de grep . O que você quer fazer é:

nc -zv 1.2.3.4 55  &>/dev/null

Isso, é claro, seria inútil, pois, se não houver saída, você não poderá grep . É para isso que o -q flag do grep é:

   -q, --quiet, --silent
          Quiet;   do   not  write  anything  to  standard  output.   Exit
          immediately with zero status if any match is found, even  if  an
          error was detected.  Also see the -s or --no-messages option.

Então, o que você procura é algo assim:

nc -zv 1.2.3.4 55 2>/dev/null | grep -q " open " && start_daemon

Ou, se você precisar analisar stderr também, isso:

nc -zv 1.2.3.4 55  |& grep -q " open " && start_daemon
    
por terdon 20.06.2016 / 18:16
1

Gerenciado para executar corretamente o script usando o status de saída do nc do netcat, enquanto o executa sem a opção -v. De qualquer forma, parece que a saída do netcat do netcat não é canalizada para o grep. Eu suponho que isso pode ser causado por algum tipo de bifurcação.

ATUALIZAÇÃO:

Como foi mencionado em um comentário à sua resposta, parte da saída de nc / netcat é impressa em stderr, parte em stout. Então, mesclar esses dois arquivos antes de canalizar para o grep faz o truque:

netcat -zvw1 1.2.3.4 55 2>&1 | grep "open"

    
por Ricardo Beschieru 21.06.2016 / 16:17