Ik “probeer te begrijpen wat grep -v grep
hieronder doet:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Of is er een betere manier om de TCP-verbindingstest te vinden?
Opmerkingen
Answer
Het sluit alle regels uit die de letterreeks grep
bevatten van de vorige pipe-uitvoer.
Answer
Als u wilt controleren of u binnen 5 seconden een ssh-verbinding tot stand kunt brengen en een commando kunt uitvoeren, doet u gewoon:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then printf "%s\n" "$server is up" fi
Uw commando zoals het is, heeft weinig zin. Aangezien u geen commando opgeeft om op de externe server uit te voeren, wordt ssh
uitgevoerd in de rlogin
mode, waar een pseudo-terminal wordt aangevraagd en de login-shell van de externe gebruiker wordt gestart (of mogelijk een ForcedCommand).
Vervolgens “pas je verschillende filters toe op de uitvoer:
-
grep -v "Connection refused"
: filter elke regel uit de output dieConnection refused
bevat. Dat heeft weinig zin, aangezien die foutmelding, als hij zou verschijnen, op stderr zou zijn geschreven, niet de standaarduitvoer diegrep
filtert, en ook omdat: -
grep "Connected to"
: selecteer alleen de regels dieConnected to
bevatten. Dat zou ook de regels uitsluiten dieConnection refused
bevatten, aangezien het onwaarschijnlijk is dat een regel beide bevat. -
grep -v grep
, verwijder ook de regels diegrep
bevatten (dus dat zijn regels die zowelConnected to
alsgrep
en nietConnection refused
!) -
wc -l
: tel het aantal resulterende regels (dus de regels inssh
“s stdout dieConnected to
bevatten, behalve degene die ookgrep
ofConnection refused
). Merk op datwc
dat nummer alleen zal uitvoeren wanneer de verbinding is verbroken, wanneer de shell-sessie is beëindigd, zoals wanneer de gebruikerexit
invoert . Maar nogmaals, aangezien de gebruiker “geen uitvoer ziet (aangezien het uiteindelijk allemaal naarwc
gaat), zal de gebruiker weinig idee hebben dat hij om die sessie te beëindigen.
man grep