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

时间:2016-03-17 16:06:15

标签: awk grep watch netstat uniq

我最近遇到了一些服务器问题。 所以我只想留下一个窗口,显示连接设备的独特和IP。

我一直在使用:

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

这没关系,但我有一个格式化问题,我无法解决,似乎是本地连接出现。

输出示例(截图) Aligment falls out 没有管道的Netstat示例 Results from NetStat 混淆的原因是我正在使用awk '{print $5}' 仅打印第5列

我假设它是因为我试图使用带有点子的手表,而某些东西与另一个不同意。

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

被修改 这是我现在正在使用的。 由于格式问题的数量,我决定反对Watch。

RED='\033[00;31m'
RESTORE='\033[0m'
YELLOW='\033[00;33m'
PURPLE='\033[00;35m'
LCYAN='\033[01;36m'
BLUE='\033[00;34m'
LIGHTGRAY='\033[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 $5}' | 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 $5}' | 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 $5}' | 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 $5}' | 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

我很欣赏这里提供的反馈,这是一个有趣的学习曲线 输出脚本示例:

enter image description here

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

1 个答案:

答案 0 :(得分:1)

这个“奇怪的”输出有几件事情。

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

那是因为你用双引号嵌入了整个命令,所以shell本身扩展$5作为位置参数,它在awk甚至运行之前消失,你最终打印出整行。

从管道中删除sed,您会看到每条行都是输出中的整行。 (或者从管道中删除awk,您将看到输出完全没有变化。)

某些行完整的唯一原因是sed在包含该行的行::ffff:之前删除了所有内容。你会注意到,最后没有一条IPv4线路(这就是它们全部显示的原因)。因此,您甚至接近预期的输出这一事实是因为您双重覆盖“仅打印远程IP列”目标。

这也是为什么你在输出中得到状态列的原因(尽管没有表明你想要的那个)。

在命令中转义\$以“修复”管道。

那说“不使用grepsed”试试这个:

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

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

这会在错误的列中与:80匹配,因此如果您希望将其限制为Local Address列,则可以使用$4 ~ /:80$/而非/:80 /来执行此操作。< / p>