Jag försöker förstå vad grep -v grep
gör nedan:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Eller finns det ett bättre sätt att hitta TCP-anslutningstest?
Kommentarer
Svar
Det utesluter alla rader som innehåller bokstavssekvensen grep
från föregående rörutmatning.
Svar
Om du vill kontrollera att du kan upprätta en ssh-anslutning inom 5 sekunder och köra ett kommando gör du bara:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then printf "%s\n" "$server is up" fi
Ditt kommando som det är meningslöst. Eftersom du inte ger ett kommando för att köra på fjärrservern kommer ssh
att köras i rlogin
-läge, där en pseudoterminal begärs och fjärranvändarens inloggningsskal startas (eller eventuellt en ForcedCommand).
Sedan tillämpar du flera filter på utgången:
-
grep -v "Connection refused"
: filtrera bort vilken rad som helst från utdata som innehållerConnection refused
. Det är lite meningsfullt eftersom det felmeddelandet om det verkade skulle skrivas på stderr, inte standardutmatningen somgrep
filtrerar, och också för att: -
grep "Connected to"
: välj endast de rader som innehållerConnected to
. Det skulle också utesluta raderna som innehållerConnection refused
eftersom det är osannolikt att en rad innehåller båda. -
grep -v grep
, ta också bort raderna som innehållergrep
(så det skulle vara rader som innehåller bådeConnected to
ochgrep
och inteConnection refused
!) -
wc -l
: räkna antalet resulterande rader (så raderna issh
”s stdout som innehållerConnected to
utom de som också innehållergrep
ellerConnection refused
). Observera attwc
bara matar ut det numret när anslutningen är stängd när shell-sessionen har avslutats, som när användaren angerexit
. Men sedan igen, eftersom användaren inte ser någon utdata (eftersom allt går tillwc
så småningom) kommer användaren att ha lite aning om att han behöver angeexit
för att avsluta sessionen.
man grep