Snažím se pochopit, co grep -v grep
dělá níže:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Nebo existuje lepší způsob, jak najít test připojení TCP?
Komentáře
odpověď
Vyloučí všechny řádky obsahující posloupnost písmen grep
z předchozího výstupu kanálu.
Odpovědět
Pokud si chcete ověřit, že můžete do 5 sekund navázat ssh připojení a spustit příkaz, stačí udělat:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then printf "%s\n" "$server is up" fi
Váš příkaz, jaký má, nemá moc smysl. Protože neposkytujete příkaz ke spuštění na vzdáleném serveru, bude ssh
spuštěn v rlogin
režim, kde je vyžadován pseudoterminál a je spuštěno přihlašovací prostředí vzdáleného uživatele (případně i ForcedCommand).
Potom na výstup aplikujete několik filtrů:
-
grep -v "Connection refused"
: odfiltruje jakýkoli řádek z výstup , který obsahujeConnection refused
. To dává malý smysl, protože tato chybová zpráva, pokud by se objevila, by byla napsána na stderr, nikoli na standardní výstup, který filtrujegrep
, a také proto, že: -
grep "Connected to"
: vyberte pouze řádky, které obsahujíConnected to
. To by také vyloučilo řádky, které obsahujíConnection refused
, protože je nepravděpodobné, že by řádek obsahoval oba. -
grep -v grep
, také odstraňte řádky, které obsahujígrep
(aby to byly řádky, které obsahujíConnected to
igrep
a neConnection refused
!) -
wc -l
: spočítat počet výsledných řádků (tedy řádky ve standardnímssh
„výstupu, který obsahujeConnected to
kromě těch, které také obsahujígrep
neboConnection refused
). Všimněte si, žewc
vygeneruje toto číslo pouze v případě, že je připojení uzavřeno, když byla ukončena relace prostředí, jako když uživatel zadáexit
. Ale znovu, protože uživatel nevidí žádný výstup (protože vše nakonec přejde nawc
), bude mít uživatel malou tušení, že musí zadatexit
ukončit relaci.
man grep