bash脚本记录/打印最近N秒内的所有连接



我想在后台运行一个脚本,每隔X秒打印如下内容:

tcp        0      0 localhost:5555          localhost:47824         ESTABLISHED
tcp        0      0 localhost:47824         localhost:5555          ESTABLISHED

即使连接已经关闭,所以我将看到在该时间范围内打开了哪些连接(无论是否关闭或仍打开)。

我这样做是为了将输出跟踪到一个临时文件:

#!/bin/sh

    #dump netstat result of established connections to a temp file
    (netstat -c | grep --line-buffered ESTABLISHED >> 1.tmp &)

while true
do
    #copy the file with the dump and flush it, something like log rotation
    #THE PROBLEM IS HERE######
    cp 1.tmp 2.tmp && rm 1.tmp
    ##########################
    #add a prefix on each line to reconize the logs
    sed -i -e 's/^/Connections: /' 2.tmp
    #print the logs to standard output, only one entry for each connection
    cat 2.tmp | uniq

    sleep 10
done

显然这不是正确的方法,因为删除文件会杀死netstat进程,我认为它会创建另一个新文件。

我可以用netstat上的head命令做一些事情来阻止它每X行并更改文件,但我不确定这是否会导致在非常快速的连接/断开上丢失一些信息

任何其他可靠的方式来记录连接都是受欢迎的,请记住,我没有root权限,但我只需要知道运行这个脚本的用户所做的连接,所以很好。

编辑:我对我刚刚发布的实际解决方案不满意,因为netstat默认每秒钟运行一次,有些连接可以更快,我需要一种方法来从运行此脚本的用户获得所有出站连接(请记住,没有根权限)。目前我正在尝试netstat -c 0.1,但我仍然无法信任它

这是@vlp建议的工作脚本,加上一个修复,以获得唯一的结果,因为只有uniq是不够的,我需要对它们进行排序以获得唯一的行。

#!/bin/sh

    #dump netstat result of established connections to a temp file
    (netstat -c | grep --line-buffered ESTABLISHED >> 1.tmp &)

while true
do
    #redirect content of 1.tmp to 2.tmp and remove it from 1.tmp
    cat 1.tmp > 2.tmp && > 1.tmp

    #add a prefix on each line to reconize the logs
    sed -i -e 's/^/Connections: /' 2.tmp
    #print the logs to standard output, only one entry for each connection
    cat 2.tmp | sort -u
    #delete the file
    rm 2.tmp
    sleep 10
done

作为一种替代方法,您可能需要考虑调查是否可以插入iptables规则来记录连接建立,并让脚本解析产生的日志。这可能需要更多的工作,但应该报告短暂的连接,并且可以(如果需要)记录拒绝的连接等。

相关内容

  • 没有找到相关文章

最新更新