netstat 如何读取路由表?

netstat 如何读取路由表?

对于我的 php 容器,如果我需要检测 ide 监听的 ip。我跑:

ip=$(netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10)

我得到了网关IP。但为此我需要安装net-toolsphp 应用程序或等效的应用程序。因此我想自己实现必要的功能(检测网关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。

相关内容