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

스크립트는 명령줄 인수로 변환할 주소를 사용하고 이를 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

두 번째 일치 항목(그룹 (\w*))에는 게이트웨이 IP가 포함됩니다.

관련 정보