Jeg prøver at forstå, hvad grep -v grep
gør nedenfor:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Eller er der en bedre måde at finde TCP-forbindelsestest på?
Kommentarer
Svar
Det udelukker alle linjer, der indeholder bogstavsekvensen grep
fra den forrige rørudgang.
Svar
Hvis du vil kontrollere, at du kan oprette en ssh-forbindelse inden for 5 sekunder og køre en kommando, skal du bare gøre:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then printf "%s\n" "$server is up" fi
Din kommando giver ingen mening. Da du ikke giver en kommando til at køre på fjernserveren, kører ssh
i rlogin
-tilstand, hvor der anmodes om en pseudoterminal, og loginbrugeren til den eksterne bruger startes (eller muligvis en ForcedCommand).
Derefter anvender du flere filtre til output:
-
grep -v "Connection refused"
: filtrer enhver linje fra output der indeholderConnection refused
. Det giver ikke mening, da den fejlmeddelelse, hvis den så ud, ville blive skrevet på stderr, ikke standardoutputtet, somgrep
filtrerer, og også fordi: -
grep "Connected to"
: vælg kun de linjer, der indeholderConnected to
. Det udelukker også de linjer, der indeholderConnection refused
, da det er usandsynligt, at en linje indeholder begge dele. -
grep -v grep
fjern også linjerne, der indeholdergrep
(så det ville være linjer, der indeholder bådeConnected to
oggrep
og ikkeConnection refused
!) -
wc -l
: tæl antallet af resulterende linjer (så linjerne issh
“s stdout, der indeholderConnected to
undtagen dem, der også indeholdergrep
ellerConnection refused
). Bemærk, atwc
kun udsender dette nummer, når forbindelsen er lukket, når shell-sessionen er afsluttet, som når brugeren indtasterexit
. Men så igen, da brugeren ikke vil se nogen output (da det hele går tilwc
til sidst), vil brugeren have lidt anelse om, at han skal indtasteexit
for at afslutte sessionen.
man grep