Bash - IP 주소를 늘리지만 서브넷 마스크를 고려하시겠습니까?

Bash - IP 주소를 늘리지만 서브넷 마스크를 고려하시겠습니까?

VPN 클라이언트에 설정한 마지막 사용 로컬 IP 주소를 저장하는 파일이 있습니다. 새 클라이언트를 추가하는 프로세스를 자동화하고 있으므로 이전 클라이언트에 사용된 IP를 읽고 다음 클라이언트에 사용된 주소를 늘리고 싶습니다.

그러나 이는 사용되는 서브넷에 민감해야 합니다. 10.0.0.0 RFC 1918 개인 네트워크에 /8 서브넷을 사용하고 있습니다.

따라서 마지막 클라이언트의 IP가 10.0.0.5라고 가정합니다. 증가한 후에는 10.0.0.6을 얻어야 합니다.

마지막 클라이언트 IP가 10.0.0.254에 도달하면 10.0.0.255로 증가하는 대신 10.0.1.1을 얻어야 합니다. 서브넷은 클라이언트가 사용할 선행 바이트(10.)를 제외한 모든 옥텟을 제공하므로 전체 범위에 대해 이 작업을 수행해야 합니다. 예:

10.0.1.254 이후 -> 10.0.2.1

10.0.254.254 이후 -> 10.1.0.1

나는 이것을 수행하는 가장 쉬운 방법을 찾고 있습니다. 라이너로 할 수 있나요?

답변1

예를 들어 유효한 IP 주소를 허용하는 경우 10.0.1.0/8다음 10.0.255.255/8과 같이 단조 증가하는 32비트 정수를 사용할 수 있습니다.

# Seed with 10.0.0.0 = 167772160
echo $(( (10<<24) + (0<<16) + (0<<8) + 0 )) >counter

# Read the counter, increment, and produce IP address
read ip <counter
echo $((++ip)) >counter

printf "%d.%d.%d.%d\n" $(( (ip>>24)&255 )) $(( (ip>>16)&255 )) $(( (ip>>8)&255 )) $((ip&255))

답변2

한 줄로 처리할 수 있는 방법은 없지만 if절과 모듈식 산술을 사용하여 처리할 수 있습니다.

이 같은:

a = 2nd octet
b = 3rd octet
c = 4th octet

if ( mod(c+1, 255) == 0)
  if (mod(b+1, 255) == 0)
    if (mod(a+1, 255) == 0)
      print "sorry, out of IP numbers"
      end
    b = 0
    a = a+1
    continue
  c = 0
  b = b+1
else
  c = c+1
print 10.a.b.c

테스트되지 않은 경우 소금 한 알과 함께 섭취하십시오.

답변3

나는 읽기를 사용하여 옥텟을 분리하는 것을 좋아합니다.

IFS='.' read -r a b c d <<< 10.0.0.0
ip=$(((a<<24)+(b<<16)+(c<<8)+d))
((ip++))
printf "%d.%d.%d.%d\n" $(((ip>>24)&255)) $(((ip>>16)&255)) $(((ip>>8)&255)) $((ip&255))

관련 정보