有没有办法显示进程的连接?像这样的东西:
show PID
其中show
是执行此操作的命令,PID
是进程的 ID。我想要的输出由进程的所有连接组成(实时)。例如,如果进程尝试连接到173.194.112.151输出是173.194.112.151
.
Firefox 的更具体示例:
show `pidof firefox`
对于 Firefox,我首先会去谷歌网站,然后到unix.stackexchange.com最后到192.30.252.129。当我关闭浏览器时,输出必须是:
google.com
stackexchange.com
192.30.252.129
(显然对于浏览器来说这个输出是不现实的,因为还有很多其他相关的连接,但这只是一个例子。)
答案1
您正在寻找strace
!我发现这个答案在askubuntu,但它对 Unix 有效:
要启动并监视新进程:
strace -f -e trace=network -s 10000 PROCESS ARGUMENTS
要监视具有已知 PID 的现有进程:
strace -p $PID -f -e trace=network -s 10000
否则,但这是 Linux 特有的,你可以在隔离的网络命名空间中运行该进程并使用wireshark来监控流量。这可能比阅读strace
日志更方便:
创建测试网络命名空间:
ip netns add test
创建一对虚拟网络接口(veth-a 和 veth-b):
ip link add veth-a type veth peer name veth-b
更改 veth-a 接口的活动命名空间:
ip link set veth-a netns test
配置虚拟接口的IP地址:
ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0 ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
在测试命名空间中配置路由:
ip netns exec test route add default gw 192.168.163.254 dev veth-a
激活 ip_forward 并建立 NAT 规则来转发来自您创建的命名空间的流量(您必须调整网络接口和 SNAT IP 地址):
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
(如果您愿意,也可以使用 MASQUERADE 规则)
最后,您可以在新的命名空间中运行要分析的进程,也可以运行wireshark:
ip netns exec test thebinarytotest ip netns exec test wireshark
您必须监视 veth-a 接口。
答案2
尝试
lsof -i -a -p $(pidof firefox | sed 's/ /,/g')
描述
Pidof 查找指定程序的进程 ID (pid)。
它在标准输出上打印这些 id。
从lsof 手册页:
-i
此选项选择其 Internet 地址与 i 中指定的地址匹配的文件列表。如果未指定地址,则此选项将选择所有 Internet 和 x.25 (HP-UX) 网络文件的列表。-a
和-p
此选项排除或选择进程的文件列表,其可选磷过程ID实体 (PID) 编号位于逗号分隔的集合 s 中 - 例如,123
或123,^456
。 (集合中不应有空格。)
为什么sed
:当我们有多个与进程名称匹配的进程时,我们希望 PID 列表从pidof
到 到lsof
,每个 PID 后面都需要逗号,我们必须将空格转换为逗号。我们也可以选择使用tr \ \,
。
当我们知道我们有具有给定进程名称的 Exactly Single Process 时,我们可以跳过sed
& tr
。
答案3
这是另一种方法:
ss -nap | grep $(pidof firefox)
示例输出:
tcp ESTAB 0 0 192.168.0.222:49050 216.58.218.164:443 users:(("firefox",3280,69))
tcp ESTAB 0 0 192.168.0.222:48630 198.252.206.25:443 users:(("firefox",3280,106))
tcp ESTAB 0 0 192.168.0.222:44220 216.58.217.38:443 users:(("firefox",3280,140))
tcp ESTAB 0 0 192.168.0.222:52690 54.240.170.181:80 users:(("firefox",3280,107))
tcp ESTAB 0 0 192.168.0.222:48744 198.252.206.25:443 users:(("firefox",3280,87))
tcp ESTAB 0 0 192.168.0.222:48811 198.252.206.25:443 users:(("firefox",3280,73))
答案4
您也可以尝试使用netstat -p
.从手册页:
netstat - 打印网络连接、路由表、接口统计信息、伪装连接和多播成员资格
要仅显示网络连接,请使用netstat -tup
.请注意,要查看进程 PID,您可能需要成为 root。
netstat
如果您的系统上没有,您可能有ss
,它的语法几乎完全相同。然后你就可以使用ss -tup
(作为root)。