Yritän ymmärtää, mitä grep -v grep
tekee alla:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Vai onko olemassa parempi tapa löytää TCP-yhteystesti?
Kommentit
Vastaa
Se sulkee pois kaikki rivit, jotka sisältävät kirjainsekvenssin grep
edellisestä putkilähdöstä.
Vastaa
Jos haluat tarkistaa, että voit luoda ssh-yhteyden 5 sekunnin kuluessa ja suorittaa komennon, tee vain:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then printf "%s\n" "$server is up" fi
Komennolla ei ole mitään järkeä. Kun et anna komentoa, joka suoritetaan etäpalvelimella, ssh
suoritetaan kohdassa rlogin
-tila, jossa pseudopäätettä pyydetään ja etäkäyttäjän kirjautumiskuori käynnistetään ForcedCommand).
Sitten käytät useita suodattimia tulosteeseen:
-
grep -v "Connection refused"
: suodata kaikki rivit tuotos , joka sisältääConnection refused
. Tällä ei ole juurikaan merkitystä, koska virheilmoitus, jos se ilmestyisi, kirjoitettaisiin stderr: ään, ei vakiolähtöön, jotagrep
suodattaa, ja myös siksi, että: -
grep "Connected to"
: valitse vain rivit, jotka sisältävätConnected to
. Tämä sulkisi myös pois rivit, jotka sisältävätConnection refused
, koska on epätodennäköistä, että rivi sisältää molempia. -
grep -v grep
, poista myös rivit, jotka sisältävätgrep
(niin että ne olisivat rivit, jotka sisältävät sekäConnected to
ettägrep
eikäConnection refused
!) -
wc -l
: lasketaan tuloksena olevien rivien määrä (joten rivitssh
”-sovelluksessa, joka sisältääConnected to
paitsi ne, jotka sisältävät myösgrep
taiConnection refused
). Huomaa, ettäwc
tuottaa kyseisen numeron vain, kun yhteys on suljettu, kun shell-istunto on lopetettu, kuten silloin, kun käyttäjä kirjoittaaexit
. Mutta sitten jälleen kerran, koska käyttäjä ei näe mitään lähtöä (koska kaikki menee lopultawc
: lle), käyttäjällä ei ole juurikaan aavistustakaan, että hänen on syötettäväexit
lopettaa istunto.
man grep