Estou tentando entender o que grep -v grep
acontece 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?
Responder1
Se você quiser verificar se consegue 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 tal como está faz pouco sentido. Como você não fornece um comando para rodar no servidor remoto, ssh
ele rodará no rlogin
modo onde um pseudo-terminal é 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 dosaídaIsso contémConnection refused
. Isso faz pouco sentido, pois 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êm,Connection refused
pois é improvável que uma linha contenha ambos.grep -v grep
, remova também as linhas que contêmgrep
(de modo que seriam linhas que contêmConnected to
egrep
e nãoConnection refused
!)wc -l
: conte o número de linhas resultantes (portanto, as linhas nossh
stdout de 's que contêm,Connected to
exceto aquelas que também contêmgrep
ou'Connection refused
). Observe quewc
esse número só será exibido quando a conexão for fechada, quando a sessão do shell for encerrada, como quando o usuário digitaexit
. Mas, novamente, como o usuário não verá nenhuma saída (já que tudo acabaráwc
eventualmente), o usuário terá poucas pistas de que precisa entrarexit
para encerrar a sessão.
Responder2
Exclui todas as linhas que contêm a sequência de letras grep
da saída anterior do pipe.