ifconfig eth:xx를 사용하여 IP를 추가할 때 한 줄에서 가장 높은 eth:xx를 찾는 방법은 무엇입니까?

ifconfig eth:xx를 사용하여 IP를 추가할 때 한 줄에서 가장 높은 eth:xx를 찾는 방법은 무엇입니까?

이것은 Perl 스크립트에 있을 것입니다. 해당 숫자를 가져와 새 IP에 대해 1씩 증가시켜야 합니다. 누구든지 나에게 하나의 라이너가 있습니까? Bash/Perl일 수 있습니다.

편집하다

다음 입력이 주어졌습니다.

inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4

4. 아래에 주신 내용을 고려하면 뱉어내야 합니다.

$ ip addr | grep -e 'eth[0-9]:[0-9]' | cut -d: -f2

이에 대한 답변을 변경하시면 이를 얻는 데 도움이 되었기 때문에 수락하겠습니다.

답변1

ifconfig

ifconfig귀하가 요구하는 내용을 이해한다면 출력을 가져오고 사용할 다음 eth:xx 장치를 반환하는 한 줄 명령을 원할 것입니다 .

따라서 eth0:0, eth0:1 및 eth0:2를 사용 중인 경우 명령은 3을 반환해야 합니까?

이와 같은 명령은 원하는 작업을 수행해야 합니다.

$ if (ifconfig | grep -q "^eth"); then \
      echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

따라서 하나의 이더넷 장치가 있는 경우:

$ ifconfig | grep eth
eth0:0      Link encap:Ethernet  HWaddr F0:DE:F1:2F:7D:4E  

우리의 명령은 1을 반환합니다:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
1

이더넷 장치가 없으면 0을 반환합니다.

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
0

세부

좋아, 여기에는 많은 일이 벌어지고 있는 것처럼 보이지만 꽤 간단합니다.

  1. if 문 - 처음에는 if 문이 있는지 알아야 합니다.어느이더넷 장치이므로 출력을 실행 ifconfig하고 grep하여 장치를 찾습니다. 하나를 찾으면 ifconfig다시 실행하여 구문 분석합니다.
  2. 두 번째 ifconfig - 이제 실제로 출력을 구문 분석하고 있습니다. 우리는 ethXX:로 시작하는 문자열을 검색하기 위해 grep의 PCRE 기능( )을 사용합니다. -P스위치 -o는 ethXX: 뒤에 나오는 숫자를 반환합니다.
  3. sort - sortethXX:YY 장치가 여러 개인 경우 결과를 숫자로 표시합니다.
  4. tail - 마지막 항목을 반환합니다. 이는 가장 높은 값의 ethXX:YY 장치입니다.
  5. 그런 다음 $(( $(ifconfig ...) + 1 )). 따라서 ethXX:YY가 0이면 0 + 1결과는 1.
  6. echo - 그런 다음 echo5단계의 결과를 가져옵니다.
  7. 출력 에 eth 장치가 없으면 ifconfig0을 반환합니다. 이것이 첫 번째 장치가 되기 때문입니다.

IP 주소

대신 사용하려면 ip addr위에 제공된 솔루션 형식을 사용하면 됩니다.

$ if (ip addr | grep -q "eth"); then \
      echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

샘플 데이터 사용:

inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4

이 명령은 5를 반환합니다.

$ if (ip addr | grep -q "eth"); then echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
5

답변2

이는 귀하의 질문에 대한 직접적인 답변은 아니지만 대체 솔루션에 가깝습니다.

대체 솔루션은 다음을 사용하는 것입니다.iproute2유용. ifconfig오래되었고 천천히 더 이상 사용되지 않습니다. 이는 부적절하며 Linux 네트워킹 스택을 완전히 조작할 수 없습니다.

예를 들어, 에서 알고 있듯이 해당 머신에 할당하려는 모든 IP에 대해 별칭 인터페이스( , 등) ifconfig를 생성해야 합니다 . 이는 255개의 인터페이스 별칭만 가질 수 있기 때문에 문제가 됩니다. iproute2의 명령을 사용하면 단일 인터페이스에 원하는 만큼 많은 IP를 할당할 수 있습니다.eth0:0eth0:1ip

사용 예:

# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link 
       valid_lft forever preferred_lft forever

# ip addr add 10.0.0.1/24 dev enp5s0

# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet 10.0.0.1/24 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link 
       valid_lft forever preferred_lft forever

이름 외에 인터페이스의 현재 구성에 대해 아무것도 알 필요가 없습니다. 사용되지 않은 다음 인터페이스 별칭 번호를 계산할 필요가 없습니다.

관련 정보