Jeg prøver å forstå hva grep -v grep
gjør nedenfor:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Eller er det en bedre måte å finne TCP-tilkoblingstest?
Kommentarer
Svar
Den ekskluderer alle linjer som inneholder bokstavsekvensen grep
fra forrige rørutgang.
Svar
Hvis du vil kontrollere at du kan opprette en ssh-forbindelse innen 5 sekunder og kjøre en kommando, gjør du bare:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then printf "%s\n" "$server is up" fi
Kommandoen din, som den er, gir liten mening. Når du ikke gir en kommando for å kjøre på den eksterne serveren, vil ssh
kjøre i rlogin
modus, der en pseudo-terminal blir bedt om og påloggingsskallet til den eksterne brukeren startes (eller muligens ForcedCommand).
Deretter bruker du flere filtre på utgangen:
-
grep -v "Connection refused"
: filtrer ut hvilken som helst linje fra utdata som inneholderConnection refused
. Det gir liten mening som feilmeldingen hvis den dukket opp ville bli skrevet på stderr, ikke standardutgangen somgrep
filtrerer, og også fordi: -
grep "Connected to"
: velg bare linjene som inneholderConnected to
. Det vil også ekskludere linjene som inneholderConnection refused
da det er lite sannsynlig at en linje inneholder begge. -
grep -v grep
, fjern også linjene som inneholdergrep
(slik at det ville være linjer som inneholder bådeConnected to
oggrep
og ikkeConnection refused
!) -
wc -l
: teller antall resulterende linjer (så linjene issh
«s stdout som inneholderConnected to
bortsett fra de som også inneholdergrep
ellerConnection refused
). Vær oppmerksom på atwc
bare vil sende det tallet når forbindelsen er lukket, når shell-økten er avsluttet, som når brukeren skriver innexit
. Men igjen, siden brukeren ikke ser noen utdata (siden alt går tilwc
til slutt), vil brukeren ha liten anelse om at han trenger å legge innexit
for å avslutte økten.
man grep