Překvapením, které jsem nedávno zjistil, je, že Bash nativně podporuje připojení tcp jako deskriptory souborů. Použití:
exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6
Jako deskriptor souboru používám 6, protože 0,1,2 jsou stdin, stdout a stderr. 5 někdy používá Bash pro podřízené procesy, takže 3,4,6,7,8 a 9 by měly být bezpečné.
Podle komentáře níže pro testování poslechu na místním serveru ve skriptu:
exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection
Chcete-li zjistit, zda někdo poslouchá, zkuste se připojit pomocí zpětné smyčky. Pokud selže, je port uzavřen nebo nám není povolen přístup. Poté spojení uzavřete.
Upravte to pro svůj případ použití, jako je odeslání e-mailu, ukončení skriptu při selhání nebo spuštění požadované služby.
Zde je velmi krátká s "rychlou odpovědí":Jak otestovat, zda je vzdálený TCP port otevřen ze skriptu Shell?
nc -z <host> <port>; echo $?
Používám ji s 127.0.0.1 jako „vzdálenou“ adresu.
toto vrátí "0", pokud je port otevřený, a "1", pokud je port uzavřen
např.
nc -z 127.0.0.1 80; echo $?
-z Určuje, že nc by měl pouze vyhledávat naslouchající démony, aniž by jim posílal jakákoli data. Je chybou použít tuto volbu ve spojení s volbou -l.
Tímto způsobem můžete použít netstat pro mnohem rychlejší výsledky:
V systému Linux:
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
V systému Mac:
netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
Tím se vypíše seznam procesů, které naslouchají na portu (v tomto příkladu 445), nebo nevypíše nic, pokud je port volný.
K tomu můžete použít netcat.
nc ip port < /dev/null
se připojí k serveru a přímo znovu uzavře připojení. Pokud se netcat nemůže připojit, vrátí nenulový výstupní kód. Výstupní kód je uložen v proměnné $?. Jako příklad
nc ip port < /dev/null; echo $?
vrátí 0 tehdy a pouze tehdy, když se netcat mohl úspěšně připojit k portu.