目录
1. 完整脚本
#!/bin/bash
#IP
ip=$(sed -n '2s/^.//p' "$0")
echo -e "PID\tPATH"
netstat -antlp | grep ESTABLISHED | grep $ip | awk '{print $7}' | grep -o '^[0-9]*' | sort -u | while read pid; do
exe_path=$(readlink -f /proc/$pid/exe)
if [ -n "$exe_path" ]; then
echo -e "${pid}\t${exe_path}"
fi
done
备注:脚本第二行IP替换为需要分析的真实IP,例如第二行为
#88.88.88.88
2. 脚本详解
2.1 Shebang和IP地址占位符
#!/bin/bash:指定脚本使用Bash shell解释器执行。#IP:这是脚本的第二行,也是一个注释行。它作为一个占位符,意图是让用户将#IP替换为需要监控的实际IP地址(例如#192.168.1.100)。脚本后续的sed命令将从这一行提取IP。
2.2 提取目标IP地址
ip=$(sed -n '2s/^.//p' "$0"):这一行使用sed命令从脚本自身("$0"代表当前脚本文件名)的第二行提取IP地址。-n选项取消默认输出,只显示处理后的行。2s/^.//p是一个替换命令:2表示只处理第二行,s/^.//表示删除行首的一个字符(^.匹配行首的第一个字符),p表示打印处理后的行。- 操作示例:假设脚本第二行为
#192.168.1.100,sed会删除开头的#(一个字符),得到192.168.1.100并赋值给变量ip。但在当前脚本中,第二行是#IP,执行后ip变量的值将是IP,这会导致后续过滤失效。因此,用户必须手动修改第二行为有效的IP地址(例如#192.168.1.100)。
2.3 输出表头
echo -e "PID\tPATH":使用-e选项启用转义字符,\t代表制表符。这行代码输出格式化的表头"PID"和"PATH",为后续结果提供列标题。
2.4 核心处理管道:查找关联进程的PID
整个管道命令netstat -antlp | grep ESTABLISHED | grep $ip | awk '{print $7}' | grep -o '^[0-9]*' | sort -u逐步处理网络连接信息:
netstat -antlp:列出所有网络连接信息。-a显示所有连接和监听端口。-n以数字形式显示地址和端口,避免DNS解析。-t仅显示TCP连接。-p显示占用端口的进程ID和程序名(通常需要root权限)。grep ESTABLISHED:从netstat结果中筛选出状态为"ESTABLISHED"(已建立)的连接行。grep $ip:进一步筛选出与变量ip(即从脚本第二行提取的IP)相关的连接行。awk '{print $7}':awk命令按空格或制表符分隔每一行,并打印第7个字段。在netstat -antlp的输出中,第7字段的格式通常为PID/程序名(例如3845/ssh)。grep -o '^[0-9]*':-o选项只输出匹配到的部分。^[0-9]*正则表达式匹配行首的数字序列。这一步从PID/程序名中提取出纯数字的PID。sort -u:对提取出的所有PID进行排序并去重(-u选项),确保每个PID只出现一次。
2.5 循环处理每个PID并获取可执行文件路径
while read pid; do ... done:循环读取上一步管道输出的每一个PID。exe_path=$(readlink -f /proc/$pid/exe):获取进程可执行文件的真实路径。- 在Linux系统中,
/proc/$pid/exe是一个指向该进程所执行程序的符号链接。readlink -f命令递归地跟随符号链接,解析出最终的绝对路径。-f选项确保即使路径中有多层符号链接也能得到正确目标。if [ -n "$exe_path" ]; then:判断变量exe_path是否非空(-n)。这是一个安全检查,确保该PID对应的进程确实存在且其路径可读。echo -e "${pid}\t${exe_path}":如果路径有效,则以制表符分隔的形式输出PID和完整的可执行文件路径,与表头对应。
854

被折叠的 条评论
为什么被折叠?



