Я пытаюсь понять, что grep -v grep
происходит ниже:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Или есть лучший способ найти тест TCP-соединения?
решение1
Если вы хотите проверить, что можете установить SSH-соединение в течение 5 секунд и выполнить команду, просто выполните:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then
printf '%s\n' "$server is up"
fi
Ваша команда в ее нынешнем виде не имеет особого смысла. Поскольку вы не предоставляете команду для запуска на удаленном сервере, ssh
будет запущен в rlogin
режиме, в котором запрашивается псевдотерминал и запускается оболочка входа удаленного пользователя (или, возможно, ForcedCommand).
Затем вы применяете к выходным данным несколько фильтров:
grep -v "Connection refused"
: отфильтровать любую строку извыходкоторый содержитConnection refused
. Это не имеет особого смысла, так как сообщение об ошибке, если бы оно появилось, было бы записано в stderr, а не в стандартный вывод, которыйgrep
фильтруется, а также потому, что:grep "Connected to"
: выбрать только строки, содержащиеConnected to
. Это также исключит строки, содержащие ,Connection refused
поскольку маловероятно, что строка будет содержать оба.grep -v grep
, также удалите строки, содержащиеgrep
(то есть это будут строки, содержащие иConnected to
,grep
и неConnection refused
!)wc -l
: подсчитать количество результирующих строк (то есть строк вssh
stdout , которые содержат ,Connected to
за исключением тех, которые также содержатgrep
илиConnection refused
). Обратите внимание, чтоwc
это число будет выведено только при закрытии соединения, когда сеанс оболочки был завершен, например, когда пользователь вводитexit
. Но опять же, поскольку пользователь не увидит никакого вывода (так как всеwc
в конечном итоге переходит в ), пользователь не будет иметь ни малейшего представления о том, что ему нужно ввестиexit
для завершения сеанса.
решение2
Он исключает все строки, содержащие последовательность букв grep
из предыдущего вывода конвейера.