Estou tentando entender o que grep -v grep
faz abaixo:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Ou existe uma maneira melhor de encontrar o teste de conexão TCP?
Comentários
Resposta
Exclui todas as linhas que contêm a sequência de letras grep
da saída do pipe anterior.
Resposta
Se você deseja verificar se pode estabelecer uma conexão ssh em 5 segundos e executar um comando, basta fazer:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then printf "%s\n" "$server is up" fi
Seu comando como está faz pouco sentido. Como você não fornece um comando para ser executado no servidor remoto, ssh
será executado no rlogin
modo, onde um pseudoterminal é solicitado e o shell de login do usuário remoto é iniciado (ou possivelmente um ForcedCommand).
Então, você está aplicando vários filtros à saída:
-
grep -v "Connection refused"
: filtre qualquer linha de a saída que contémConnection refused
. Isso faz pouco sentido, já que a mensagem de erro se aparecesse seria escrita em stderr, não na saída padrão quegrep
está filtrando e também porque: -
grep "Connected to"
: selecione apenas as linhas que contêmConnected to
. Isso também excluiria as linhas que contêmConnection refused
, pois é “improvável que uma linha contenha os dois. -
grep -v grep
, remova também as linhas que contêmgrep
(para que sejam linhas que contenhamConnected to
egrep
e nãoConnection refused
!) -
wc -l
: conte o número de linhas resultantes (portanto, as linhas emssh
“s stdout que contémConnected to
exceto aqueles que também contêmgrep
ouConnection refused
). Observe quewc
só exibirá esse número quando a conexão for fechada, quando a sessão do shell for encerrada, como quando o usuário entra emexit
. Mas, novamente, uma vez que o usuário “não verá nenhuma saída (já que tudo vai parawc
eventualmente), o usuário terá poucas pistas de que precisa inserirexit
para encerrar essa sessão.
man grep