监控服务器连接 - Netstat 格式问题

Monitoring Server Connections - Netstat formatting issue

我最近在服务器上遇到了一些问题。 所以我只想留下一个 window 来显示连接设备的唯一性和 IP。

我一直在使用:

watch -n 5 "netstat -tn 2>/dev/null | grep :80 | awk '{print }' | sed 's/.*::ffff://' | sort | uniq -c | sort -nr"

这工作正常,但我有一个我无法解决的格式问题,似乎是在出现本地连接时。

输出示例(屏幕截图) 不带管道的 Netstat 示例 混淆的原因是我正在使用 awk '{print }' 仅打印第 5 列

我假设它是因为我正在尝试使用带点的手表,但有些东西与另一个不一致。

任何人都可以建议对 one liner 进行调整, 或者任何人都可以建议另一种工具来监视与服务器的活动连接(对本地连接不感兴趣)

已编辑 这是我现在正在使用的。 由于格式问题的数量,我决定不使用 Watch。

RED='3[00;31m'
RESTORE='3[0m'
YELLOW='3[00;33m'
PURPLE='3[00;35m'
LCYAN='3[01;36m'
BLUE='3[00;34m'
LIGHTGRAY='3[00;37m'

while true
do
echo -e ${RED}"Connection Script"
echo -e ${YELLOW}"Current Active Connections to the Server Port 80"
  netstat -tn 2>/dev/null | awk '/:80 / {print }' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
echo -e ${RESTORE}
echo -e ${PURPLE}"FTP Connections: 21"
  netstat -tn 2>/dev/null | awk '/:21 / {print }' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
echo -e ${RESTORE}
echo -e ${LCYAN}"SSH/'SFTP' Connections: 22"
  netstat -tn 2>/dev/null | awk '/:22 / {print }' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
echo -e ${RESTORE}
echo -e ${RED}"Yellowfin Connections: 8181"
  netstat -tn 2>/dev/null | awk '/:8181 / {print }' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
echo -e ${RESTORE}
MySQLCon=$(netstat -tn 2>/dev/null | awk '/:3306 /' | sort | uniq -c | sort -nr | wc -l)
echo -e ${RESTORE}
echo -e $LIGHTGRAY"MySQL Active Connections on port 3306 =" $MySQLCon
echo -e ${RESTORE}
  sleep 5
  clear
done

感谢此处提供的反馈,这是一条有趣的学习曲线 输出脚本示例:

由于IP特殊,部分图片已被涂黑;-)

此 "odd" 输出中包含一些内容。

查看watch声称是运行的命令。具体看awk脚本。看到是awk '{print }'?

那是因为您将整个命令嵌入双引号中,所以 shell 本身会扩展 </code> 作为位置参数,它甚至在 <code>awk 运行之前就消失了,您最终会打印出来整行。

从管道中删除 sed,您会看到 every 行是输出中的完整行。 (或者从管道中删除 awk,您会发现输出根本没有改变。)

某些行 没有 的唯一原因是 sed 删除了包含该行的 ::ffff: 之前的所有内容。您会注意到,末尾的 IPv4 行中有 none(这就是它们完整显示的原因)。因此,您甚至接近预期输出的事实是因为您 双重覆盖 "only print the remote IP column" 目标。

这也是您在输出中获得状态列的原因(尽管一开始并没有表明您想要它)。

在命令中转义 $ 到 "fix" 管道。

那是为了 "not using grep and sed" 试试这个:

netstat -tn | awk '/:80 / {print }'

看看你想要的东西有多接近你。

这将匹配错误列中的 :80,因此如果您想将其限制为 Local Address 列,您可以使用 ~ /:80$/ 而不是 /:80 / .