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/810.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

1行で処理する方法はありませんが、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))

関連情報