web-dev-qa-db-ja.com

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

現在、私はこれにnetstatを使用しています:

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

よりエレガントな解決策はありますか?

3
Eugene Yarmash

エレガンスに関する限り、私はあなたのコマンドで2つのことを変更します:

  • Chrisのコメントで述べたように、出力リダイレクトの代わりに-qを使用できます。
  • 2つではなく1つのgrepを使用します。

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

ssを使用:

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

lsof 仕事をする必要があります。 -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"]
    }
'

Linuxの場合、今のところこれで十分に機能します。

他のUNIXシステム(私が手にしているのはMac OS XとSolarisです)では、ポートは.ではなく:で区切られています。

そして、これはほとんどの場合、IPv6接続で失敗します。 netstatはIPv6アドレスを切り捨てるため、必ず--wideを使用してください。しかし、繰り返しになりますが、これは移植可能なオプションではありません。

1
bahamat

lsofの代わりにnetstatを使用できます:Sudo /usr/sbin/lsof -i [email protected]:80ですが、lsofはrootユーザーのみが使用でき、デフォルトではインストールされないことが多いため、追加の外部依存関係になります。

1
rvs