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

时间:2015-06-02 07:59:16

标签: bash file networking grep netstat

我想:在后台运行一个脚本,每隔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默认每秒运行一次,而且某些连接可能更快,我需要一种方法来获取运行此服务的用户的所有出站连接脚本(记住,没有root权限)。目前我正在尝试netstat -c 0.1,但我仍然不能相信它

2 个答案:

答案 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

答案 1 :(得分:1)

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