#!/bin/bash
# 目标IP列表,使用空格分隔
TARGET_IPS=("192.168.1.1" "192.168.1.2" "192.168.1.3")
# 输出文件名
OUTPUT_FILE="connection_log.txt"
# 监控间隔(秒)
INTERVAL=5
# 清空输出文件
> $OUTPUT_FILE
# 无限循环以实现实时监控
while true
do
# 打开文件并追加日志
exec 3>>$OUTPUT_FILE
# 循环检查每个IP
for ip in "${TARGET_IPS[@]}"
do
# 使用netstat找到与目标IP的连接
connections=$(netstat -an | grep $ip)
# 如果有连接,打印详细信息
if [ ! -z "$connections" ]; then
# 找到使用源端口的进程
for conn in $connections
do
# 分割字符串以获取源IP、源端口和目的端口
src_ip=$(echo $conn | awk '{print $4}' | cut -d ':' -f 1)
src_port=$(echo $conn | awk '{print $4}' | cut -d ':' -f 2)
dst_port=$(echo $conn | awk '{print $5}' | cut -d ':' -f 2)
# 使用lsof找到使用该端口的进程
process=$(lsof -i :$src_port | awk '{print $1}')
# 输出到文件
if [ ! -z "$process" ]; then
log_entry="源IP: $src_ip, 源端口: $src_port, 目的IP: $ip, 目的端口: $dst_port, 进程: $process"
echo $log_entry >&3
echo $log_entry
fi
done
fi
done
# 关闭文件
exec 3>&-
# 等待一段时间再检查
sleep $INTERVAL
done
这个bash脚本会在每次检测到新的连接时,立即将连接信息写入到文件中。这是通过使用文件描述符3来打开文件并追加新的日志条目实现的。在每次循环开始时,文件会被打开,并在循环结束时关闭。这样,无论是否检测到新的连接,都会在每次循环结束时保存文件。