![netstat 如何读取路由表?](https://linux22.com/image/224418/netstat%20%E5%A6%82%E4%BD%95%E8%AF%BB%E5%8F%96%E8%B7%AF%E7%94%B1%E8%A1%A8%EF%BC%9F.png)
对于我的 php 容器,如果我需要检测 ide 监听的 ip。我跑:
ip=$(netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10)
我得到了网关IP。但为此我需要安装net-tools
php 应用程序或等效的应用程序。因此我想自己实现必要的功能(检测网关ip)。
netstat
那么类似的工具(例如)如何route
能够读取路由表呢?
据我所知,linux 会生成一个路由表,但不知道该表的存储位置。
答案1
Perl 提供了一种简单的数据转换方法。
#!/usr/bin/env perl
$s = shift @ARGV or die "One argument expected\n";
@h = reverse unpack("A2A2A2A2", $s);
@i = map { hex($_) } @h;
print +(join ".", @i), "\n";
用您的数据写成一行:
perl -e '$s=shift @ARGV;@h=reverse unpack"A2A2A2A2",$s;@i=map{hex }@h;print +(join".",@i),"\n"' 010016AC
172.22.0.1
该脚本将要转换的地址作为命令行参数;将其解压为四个 2 字符字符串;反转字符串的顺序;将每个 2 个字符转换为十进制值,并在对之间使用点字符打印序列。
答案2
和任何其他命令netstat
将路由表与文件分开/proc/net/route
。
如果制作脚本,则将 ip 编码为具有反转顺序的十六进制字符串,例如,将 ip172.22.0.1
编码为010016AC
一个简单的方法,将其010016AC
分成 2 个字母块到一个表中,并进行相反的遍历。在每次遍历时将十六进制字符串转换为整数。
换句话说,您需要执行以下操作:
010016AC -> AC160001 -> AC.16.00.01 -> 172.22.0.1
对于 php 脚本,我还使用了以下正则表达式(带有preg_match
):
/^\w*\s(00000000)\s(\w*)/m
第二个匹配项(组(\w*)
)包含网关 ip。