如何测试 Bash 中是否建立了与给定主机/端口的连接?

如何测试 Bash 中是否建立了与给定主机/端口的连接?

目前我正在使用 netstat 来实现此目的:

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

有更优雅的解决方案吗?

答案1

就优雅而言,我会修改您命令中的两件事:

  • 正如 Chris 在评论中提到的,您可以使用-q输出重定向来代替。
  • 使用一个grep而不是两个:

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

答案2

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"]
    }
'

答案3

ss

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

答案4

您可以使用类似这样的 : 来lsof代替: ,但 lsof 仅适用于 root 用户,并且通常默认情况下不安装,因此它是额外的外部依赖项。netstatsudo /usr/sbin/lsof -i [email protected]:80

相关内容