ifconfig eth:xxでIPを追加する場合、1行で最大のeth:xxを見つけるにはどうすればよいですか?

ifconfig eth:xxでIPを追加する場合、1行で最大の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 デバイスからの出力を取得して返す 1 行のコマンドが必要なのですね。

つまり、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

したがって、イーサネット デバイスが 1 つある場合は次のようになります。

$ 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文 - 最初に、どれでもイーサネット デバイスなので、実行してifconfig出力を grep して、デバイスを探します。デバイスが見つかった場合は、ifconfig再度実行して解析します。
  2. 2 番目の ifconfig - ここでは実際に出力を解析しています。grepの PCRE 機能 ( -P) を使用して、ethXX: で始まる文字列を検索します。-oスイッチは、ethXX: の後に続く数字を返します。
  3. sortsort - ethXX:YY デバイスが複数ある場合は、結果を数値順に並べます。
  4. tail - 最後のものを返します。これは、最も値の高い ethXX:YY デバイスになります。
  5. 次に、 を介してこの番号を増分します$(( $(ifconfig ...) + 1 ))。したがって、 ethXX:YY が 0 の場合は、0 + 1となり、 になります1
  6. echo - 次にechoステップ 5 の結果を表示します。
  7. 出力に eth デバイスが存在しない場合はifconfig、これが最初のデバイスとなるため、0 を返します。

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エイリアス インターフェイス ( eth0:0、など) を作成する必要があります。インターフェイス エイリアスは 255 個しか持てないため、これは問題となります。iproute2のコマンドを使用すると、単一のインターフェイスに任意の数の IP を割り当てることができます。eth0: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

インターフェイスの名前以外の現在の構成については何も知る必要はありません。次の未使用のインターフェイス エイリアス番号を計算する必要もありません。

関連情報