Я пытаюсь сделать сторожевой сценарий удара, который должен проверить, открыт ли порт, на основе статуса выхода, иначе должен запустить демона. Проблема, мне не может удаться избежать сценария, производящего любую информацию путем перенаправления STDOUT и STDERR.
nc -zv 1.2.3.4 55 | grep " open " >/dev/null 2>&1
или
nc -zv 1.2.3.4 55 | grep " open " 2>&1 >/dev/null
или
nc -zv 1.2.3.4 55 | grep " open " &>/dev/null
возвраты так или иначе
'FQDN_hostname_or_domainname [1.2.3.4] 55 (?) open'
Тем не менее, эта комбинация работает с другими командами, такой как netstat
. Это - что-то о netcat, или возможно о синтаксисе удара? Сообщите мне то, что я понимаю превратно.
Проблема не имеет никакого отношения nc
или netcat
или любой их род. Вы выполняете две команды сюда, nc
и grep
, но только перенаправляете вывод grep
. То, что Вы хотите сделать:
nc -zv 1.2.3.4 55 &>/dev/null
, Который, конечно, был бы бессмыслен с тех пор, если нет никакого вывода, Вы не можете grep
. Это - то, для какого grep's -q
флаг:
-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.
Так, то, что Вы после, является чем-то вроде этого:
nc -zv 1.2.3.4 55 2>/dev/null | grep -q " open " && start_daemon
Или, если необходимо проанализировать stderr также, это:
nc -zv 1.2.3.4 55 |& grep -q " open " && start_daemon
Управляемый для получения сценария, выполняющего правильно использование статуса выхода nc netcat, при выполнении его без-v опции. Так или иначе кажется, что вывод netcat netcat не становится переданным по каналу в grep. Я предполагаю, что это могло бы быть вызвано своего рода разветвлением.
ОБНОВЛЕНИЕ:
Как terdon упомянутый в комментарии его ответу, часть вывода от nc
/ netcat
печатается к stderr, части к крепкому портеру. Так слияние этих двух файлов прежде, чем передать по каналу к grep добивается цели:
netcat -zvw1 1.2.3.4 55 2>&1 | grep "open"