現在、私はこれにnetstatを使用しています:
if netstat -an | grep ESTABLISHED | grep $address:$port > /dev/null; then
# command
fi
よりエレガントな解決策はありますか?
エレガンスに関する限り、私はあなたのコマンドで2つのことを変更します:
-q
を使用できます。2つではなく1つのgrep
を使用します。
if netstat -an | grep -q " $address:$port .* ESTABLISHED"; then
ss
を使用:
if ss -n -o state established '( dport = $hostname:$portnumber )'|awk 'NR==2{exit 0}END{exit 1}';then
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
を使用してください。しかし、繰り返しになりますが、これは移植可能なオプションではありません。
lsof
の代わりにnetstat
を使用できます:Sudo /usr/sbin/lsof -i [email protected]:80
ですが、lsofはrootユーザーのみが使用でき、デフォルトではインストールされないことが多いため、追加の外部依存関係になります。