web-dev-qa-db-fra.com

Redirection STDOUT et STDERR pour nc

J'essaye de faire un script de chien de garde bash qui doit vérifier si le port est ouvert, basé sur le statut de sortie, sinon il devrait démarrer le démon. Le problème est que je ne parviens pas à éviter que le script produise des informations en redirigeant STDOUT et 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

retourne quand même

'FQDN_hostname_or_domainname [1.2.3.4] 55 (?) open'

Néanmoins, ce combo fonctionne avec d'autres commandes, telles que netstat. Est-ce quelque chose à propos de netcat, ou peut-être à propos de la syntaxe bash? S'il vous plaît laissez-moi savoir ce que je me trompe.

3
Ricardo Beschieru

Le problème n'a rien à voir avec nc ou netcat ou l'un de leurs semblables. Vous exécutez deux commandes ici, nc et grep, mais vous ne redirigez que la sortie de grep. Ce que tu veux faire c'est:

nc -zv 1.2.3.4 55  &>/dev/null

Bien entendu, cela serait inutile car s'il n'y a pas de sortie, vous ne pouvez pas grep. Le drapeau -q de grep est destiné à:

   -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.

Donc, ce que vous recherchez ressemble à ceci:

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

Ou, si vous devez également analyser stderr, ceci:

nc -zv 1.2.3.4 55  |& grep -q " open " && start_daemon
5
terdon

Géré pour que le script s'exécute correctement en utilisant le statut de sortie de nc de netcat, tout en l'exécutant sans l'option -v. Quoi qu'il en soit, il semble que la sortie de netcat ne soit pas acheminée dans grep. Je suppose que cela pourrait être causé par une sorte de fourrage.

MISE À JOUR:

Comme Terdon l'a mentionné dans un commentaire, une partie de la sortie de nc/netcat est imprimée sur stderr, une partie sur stout. Donc, la fusion de ces deux fichiers avant de rediriger vers grep fait l'affaire:

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

1
Ricardo Beschieru