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";

データと一緒に1行で書いてください。

perl -e '$s=shift @ARGV;@h=reverse unpack"A2A2A2A2",$s;@i=map{hex }@h;print +(join".",@i),"\n"' 010016AC
172.22.0.1

スクリプトはコマンドライン引数に変換するアドレスを使用し、それを4つの2文字の文字列に解凍し、各2文字を10進値に変換し、ペアの間にドット文字を使用してシーケンスを印刷します。

答え2

netstatまた、ルーティングテーブルをファイルから分離する他のコマンドもあります/proc/net/route


たとえば、スクリプトを作成して IP を逆順の 16 進文字列にエンコードする場合、IP を172.22.0.1エンコードする010016AC簡単な方法は、010016ACIP を 2 つの文字チャンクに分割してテーブルにし、逆巡回を実行することです。繰り返すたびに、16進文字列を整数に変換します。

つまり、次のことを行う必要があります。

010016AC -> AC160001 -> AC.16.00.01 -> 172.22.0.1

PHPスクリプトでは、次の正規表現も使用しました(preg_match)。

/^\w*\s(00000000)\s(\w*)/m

2番目の一致(グループ(\w*))にはゲートウェイIPが含まれます。

関連情報