Sto cercando di capire cosa fa grep -v grep
di seguito:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
O esiste un modo migliore per trovare il test di connessione TCP?
Commenti
Answer
Esclude tutte le righe contenenti la sequenza di lettere grep
dalloutput della pipe precedente.
Risposta
Se vuoi verificare di poter stabilire una connessione ssh entro 5 secondi ed eseguire un comando, esegui semplicemente:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then printf "%s\n" "$server is up" fi
Il tuo comando così comè non ha molto senso. Poiché non fornisci un comando da eseguire sul server remoto, ssh
verrà eseguito nel rlogin
modalità, dove viene richiesto uno pseudo-terminale e viene avviata la shell di login dellutente remoto (o forse un ForcedCommand).
Quindi, stai applicando diversi filtri alloutput:
-
grep -v "Connection refused"
: filtra qualsiasi riga da l output che contieneConnection refused
. Non ha molto senso in quanto il messaggio di errore se apparisse sarebbe scritto su stderr, non sulloutput standard chegrep
sta filtrando, e anche perché: -
grep "Connected to"
: seleziona solo le righe che contengonoConnected to
. Ciò escluderebbe anche le righe che contengonoConnection refused
poiché è improbabile che una riga contenga entrambi. -
grep -v grep
, rimuovi anche le righe che contengonogrep
(in modo che siano righe che contengono siaConnected to
egrep
e nonConnection refused
!) -
wc -l
: conta il numero di righe risultanti (quindi le righe inssh
“s stdout che contengonoConnected to
tranne quelli che contengono anchegrep
oConnection refused
). Tieni presente chewc
restituirà quel numero solo quando la connessione viene chiusa, quando la sessione della shell è stata terminata, come quando lutente entra inexit
. Ma poi di nuovo, poiché lutente “non vedrà alcun output (dato che alla fine va tutto awc
), lutente avrà pochi indizi sul fatto che debba inserireexit
per terminare la sessione.
man grep