我想:在后台运行一个脚本,每隔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
,但我仍然不能相信它
答案 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
规则来记录连接建立,并让脚本解析生成的日志。这可能需要更多工作,但应该报告短期连接,并且可以(如果需要)记录拒绝连接等等。