Exclui todas as linhas que contêm a seqüência de letras grep
da saída do pipe anterior.
Estou tentando entender o que o 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?
Se você quiser verificar se pode estabelecer uma conexão ssh dentro de 5 segundos e executar um comando, faça:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then
printf '%s\n' "$server is up"
fi
Seu comando como é faz pouco sentido. Como você não fornece um comando para executar no servidor remoto, ssh
será executado no modo rlogin
, em que um pseudo-terminal é solicitado e o shell de login do usuário remoto é iniciado (ou possivelmente um ForcedCommand ).
Em seguida, você está aplicando vários filtros à saída:
grep -v "Connection refused"
: filtra qualquer linha da saída que contenha Connection refused
. Isso faz pouco sentido, já que a mensagem de erro, se aparecesse, seria escrita em stderr, não a saída padrão que grep
está filtrando, e também porque: grep "Connected to"
: selecione apenas as linhas que contêm Connected to
. Isso também excluiria as linhas que contêm Connection refused
, já que é improvável que uma linha contenha as duas. grep -v grep
, também remove as linhas que contêm grep
(de modo que seriam linhas que contenham Connected to
e grep
e não Connection refused
!) wc -l
: conta o número de linhas resultantes (portanto, as linhas no stdout de ssh
que contêm Connected to
, exceto aquelas que também contêm grep
ou Connection refused
). Observe que wc
só produzirá esse número quando a conexão for fechada, quando a sessão do shell tiver sido encerrada, como quando o usuário digita exit
. Mas, novamente, como o usuário não verá nenhuma saída (já que tudo vai para wc
eventualmente), o usuário terá pouca noção de que precisa inserir exit
para finalizar essa sessão. Tags shell shell-script