Bashで特定のホスト/ポートへの接続が確立されているかどうかをテストする方法は?

Bashで特定のホスト/ポートへの接続が確立されているかどうかをテストする方法は?

現在私はこれを達成するためにnetstatを使用しています。

if netstat -an | grep ESTABLISHED | grep $address:$port > /dev/null; then
    # command
fi  

よりエレガントなソリューションはありますか?

答え1

エレガンスの面では、あなたのコマンドの2つを修正します。

  • Chrisがコメントで述べたように、代わりに-q出力リダイレクトを使用できます。
  • grep2つの代わりに1つを使用してください。

    if netstat -an | grep -q " $address:$port .* ESTABLISHED"; then
    

答え2

lsof仕事をしなければなりません。 optionsを使用して、機械が分析できる出力を提供するように依頼してください-F

lsof -n -i @${hostname}:${port} -F nT | grep '^TST=ESTABLISHED$'

追加情報が必要な場合:

lsof -n -i -F nT | awk '
    function host_port(s, a) {
        match(s, /:[^:]*$/);
        a["host"] = substr(s, 1, RSTART-1);
        a["port"] = substr(s, RSTART+1);
    }
    sub(/^p/,"") {pid = $0}
    sub(/^n/,"") {
        split($0, endpoints, "->");
        host_port(endpoints[1], from);
        host_port(endpoints[2], to);
    }
    /^TST=ESTABLISHED$/ {
        print "Established from", from["host"] ":" from["port"],
              "to", to["host"] ":" to["port"]
    }
'

答え3

そしてss

if ss -n -o state established '( dport = $hostname:$portnumber )'|awk 'NR==2{exit 0}END{exit 1}';then 

答え4

lsof:代わりにこのようなものを使用できますが、lsofはルートでのみ機能し、通常はデフォルトでインストールされないため、追加の外部依存関係です。netstatsudo /usr/sbin/lsof -i [email protected]:80

関連情報