멋진 "ip 경로" 디스플레이

멋진 "ip 경로" 디스플레이

더 이상 사용되지 않는 유틸리티 ( , , ...) 대신 더 많은 iproute2( 명령) 유틸리티를 사용하고 싶습니다 .ipnet-toolsifconfigroute

net-tools제가 계속해서 돌아오는 주된 이유는 겸손한 의견으로는 출력이 이전 출력이 명확하게 제공하는 것에 비해 ip route명확성이 부족하기 때문입니다.route열 제목:

  • IP 라우팅:

    default via 192.168.134.254 dev enp1s0  proto static  metric 100 
    10.42.0.0/24 dev wlp2s0  proto kernel  scope link  src 10.42.0.1  metric 600 
    10.56.30.0/24 dev enx00133b0402c2  proto kernel  scope link  src 10.56.30.143 
    169.254.0.0/16 dev wlp2s0  scope link  metric 1000 
    192.168.57.0/24 dev vboxnet1  proto kernel  scope link  src 192.168.57.1 linkdown 
    192.168.134.0/24 dev enp1s0  proto kernel  scope link  src 192.168.134.142  metric 100 
    
  • 노선:

    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         192.168.134.254 0.0.0.0         UG    100    0        0 enp1s0
    10.42.0.0       *               255.255.255.0   U     600    0        0 wlp2s0
    10.56.30.0      *               255.255.255.0   U     0      0        0 enx00133b0402c2
    link-local      *               255.255.0.0     U     1000   0        0 wlp2s0
    192.168.57.0    *               255.255.255.0   U     0      0        0 vboxnet1
    192.168.134.0   *               255.255.255.0   U     100    0        0 enp1s0
    

질문: 명령을 사용하여 경로를 명확하고 아름답게 표시하는 방법이 있습니까 ip?

답변1

패키지 iproute2(Debian, Ubuntu)와 iproute패키지(CentOS, RedHat) 모두 이를 위해 특별히 설계된 유틸리티를 포함합니다.routel,예쁜 출력 형식으로 경로 나열.

출력 예:

[2022-02-12 04:21:05]» routel
         target            gateway          source    proto    scope    dev tbl
        default        192.168.1.1                                   ob-top 
   10.171.32.0/ 24                     10.171.32.1   kernel     link lxdbr0 
   169.254.0.0/ 16                                              link ob-top 
    172.17.0.0/ 16                      172.17.0.1   kernel     linkdocker0 
   192.168.1.0/ 24                   192.168.1.101   kernel     link ob-top 
 192.168.122.0/ 24                   192.168.122.1   kernel     link virbr0  
    10.171.32.0          broadcast     10.171.32.1   kernel     link lxdbr0 local
    10.171.32.1              local     10.171.32.1   kernel     host lxdbr0 local
  10.171.32.255          broadcast     10.171.32.1   kernel     link lxdbr0 local
      127.0.0.0          broadcast       127.0.0.1   kernel     link     lo local
     127.0.0.0/ 8            local       127.0.0.1   kernel     host     lo local
      127.0.0.1              local       127.0.0.1   kernel     host     lo local
127.255.255.255          broadcast       127.0.0.1   kernel     link     lo local
     172.17.0.0          broadcast      172.17.0.1   kernel     linkdocker0 local
     172.17.0.1              local      172.17.0.1   kernel     hostdocker0 local
 172.17.255.255          broadcast      172.17.0.1   kernel     linkdocker0 local
    192.168.1.0          broadcast   192.168.1.101   kernel     link ob-top local
  192.168.1.101              local   192.168.1.101   kernel     host ob-top local
  192.168.1.255          broadcast   192.168.1.101   kernel     link ob-top local
  192.168.122.0          broadcast   192.168.122.1   kernel     link virbr0 local
  192.168.122.1              local   192.168.122.1   kernel     host virbr0 local
192.168.122.255          broadcast   192.168.122.1   kernel     link virbr0 local

답변2

몇 년 후 내 질문에 대답하려면 ...

2018년 2월에 멋진 컬러 디스플레이가 추가되었다는 소식을 방금 알게 되었습니다. 이렇게 하면 출력을 더 쉽게 읽을 수 있습니다.

여기에 이미지 설명을 입력하세요.

~에서사람의 IP 주소:

   -c[color][={always|auto|never}
          Configure color output. If parameter is omitted or always, color
          output is enabled regardless of stdout state. If parameter is auto,
          stdout is checked to be a terminal before enabling color output. If
          parameter is never, color output is disabled. If specified multiple
          times, the last one takes precedence. This flag is ignored if -json
          is also given.

답변3

이 awk 스크립트는 출력 값이 쌍으로 되어 있다고 가정합니다(아마도 부정확할 수 있음).키워드 값, 예를 들어 scope link첫 번째 열 및 linkdown키워드와 같은 일부 예외가 있습니다. 열과 데이터를 누적하고 결과를 인쇄합니다.

awk '
{   i = 1; h = " ip"
    hdr[h] = 1
    col[h,NR] = $i
    for(i=2;i<=NF;){
        if($i=="linkdown"){extra[NR] = $i; i++; continue}
        hdr[$i] = 1
        col[$i,NR] = $(i+1)
        i += 2
    }
}
END{     #PROCINFO[sorted_in] = "@ind_str_asc"
    n = asorti(hdr,x)
    for(i=1;i<=n;i++){ h = x[i]; max[h] = length(h) }
    for(j = 1;j<=NR;j++){
        for(i=1;i<=n;i++){
            h = x[i]
            l = length(col[h,j])
            if(l>max[h])max[h] = l
        }
    }
    for(i=1;i<=n;i++){ h = x[i]; printf "%-*s ",max[h],h }
    printf "\n"
    for(j = 1;j<=NR;j++){
        for(i=1;i<=n;i++){ h = x[i]; printf "%-*s ",max[h],col[h,j] }
        printf "%s\n",extra[j]
    }
}'

결과는 80개 열보다 넓습니다.

 ip              dev             metric proto  scope src             via             
default          enp1s0          100    static                       192.168.134.254 
10.42.0.0/24     wlp2s0          600    kernel link  10.42.0.1                       
10.56.30.0/24    enx00133b0402c2        kernel link  10.56.30.143                    
169.254.0.0/16   wlp2s0          1000          link                                  
192.168.57.0/24  vboxnet1               kernel link  192.168.57.1                    linkdown
192.168.134.0/24 enp1s0          100    kernel link  192.168.134.142                 

스크립트는 hdr검색된 키를 보관하기 위해 연관 배열을 사용하고, col값을 보관하기 위해 키와 행 번호로 인덱싱된 2D 배열을 사용합니다. 첫 번째 열은 첫 번째 열로 정렬되도록 선행 공백이 있는 고안된 키워드로 ip특별히 처리됩니다 . 이 extra배열은 linkdownlone 키워드를 기록합니다.

데이터가 끝나면 헤더가 인덱스 배열로 정렬 x되고 모든 값을 반복하여 최대 열 너비를 찾습니다. 그런 다음 열 헤더를 인쇄한 다음 저장된 데이터를 인쇄합니다.

답변4

이건 적응이야@therealak12의 답변.

  • flags먼저 모든 JSON 값을 문자열로 변환하여 배열을 포함합니다.jq 'map( with_entries( .value |= tostring ) ) | ...'
  • 더 많은 열 추가( ip -d ...)
  • 라우팅 테이블( ip route show table all) 에 모든 데이터를 추가합니다.
  • column -ts $'\t'유일한 열 구분 기호로 탭 문자를 나타내는 데 사용됩니다.
ip -d -j route show table all | jq -r 'map( with_entries(  .value |= tostring  ) ) | ["target(dst)", "via(gateway)",  "source(prefsrc/src)", "dev", "protocol(proto)", "scope", "type", "metric", "table", "pref", "flags"], (.[] | [.dst // "-", .gateway // "-", .prefsrc // "-", .dev // "-", .protocol // "-", .scope // "-", .type // "-", .metric // "-", .table // "-", .pref // "-", .flags // "-"]) | @tsv' | column -ts $'\t'

관련 정보