Ubuntu下Bash脚本问题:实时连接信息协议与IP匹配错误
问题分析与脚本修正
原脚本的核心问题是两次独立调用netstat导致协议与IP无法一一对应,且将所有协议存入单个变量后循环输出,造成每行重复显示所有协议。以下是修正后的实现方案:
修正后的脚本
#!/bin/bash while true; do clear echo -e "Protocol\tIP Address\tName" # 一次性获取对应关系:协议名(本地服务)+ 远程IP netstat -tu | grep 'ESTABLISHED' | awk '{ split($4, local_addr, ":"); split($5, remote_addr, ":"); print local_addr[2], remote_addr[1] }' | while read prot ip; do # 获取主机名,跳过nbtscan首行的扫描提示 nbt=$(nbtscan "$ip" | awk 'NR>1 {print $2}') # 处理未获取到主机名的情况 [ -z "$nbt" ] && nbt="Unknown" echo -e "$prot\t\t$ip\t\t$nbt" done sleep 2 done
关键修正点
- 合并
netstat调用:
用一次netstat -tu(不带n参数,保留服务名),通过awk同时提取本地服务名(如ssh/ftp)和远程IP,确保每组协议与IP严格对应,避免两次命令输出的顺序/行数差异。 - 逐行循环处理:
通过while read prot ip直接读取每一组匹配的协议与IP,实现一一对应输出。 - 优化主机名获取:
用NR>1跳过nbtscan首行的扫描信息,避免无效内容;增加默认值Unknown处理无法获取主机名的场景。 - 格式对齐:调整制表符数量,让输出更规整。
原脚本问题总结
- 两次独立执行
netstat(一次带n、一次不带),可能导致输出行的顺序或数量不一致,破坏协议与IP的对应关系。 - 将所有协议存入单个变量
prot,循环IP时每次输出整个变量,造成每行重复显示所有协议。
内容的提问来源于stack exchange,提问作者user20647503
相关产品推荐
相关产品推荐

