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必要なものを理解している場合は、出力を取得して使用する次の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

したがって、イーサネットデバイスがある場合:

$ 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してデバイスを見つけます。 1つが見つかったら、ifconfigもう一度実行して解析します。
  2. 2番目のifconfig - 実際に出力を解析しています。grepPCREツール()を使用して、-PethXX:で始まる文字列を検索します。スイッチは-oethXX:の後に表示される番号を返します。
  3. 並べ替え - sortethXX:YY デバイスが複数ある場合、結果を数値で表示します。
  4. tail - 最も高い値の ethXX:YY デバイスになる最後のデバイスを返します。
  5. その後、この数字を増やして増やします$(( $(ifconfig ...) + 1 ))。したがって、ethXX:YYが0の場合は0 + 11つが得られます1
  6. echoecho - これにより、ステップ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

これはあなたの質問に直接答えるのではなく、代替ソリューションに近いです。

代替ソリューションは、次を使用することです。IP ルート 2便利です。ifconfig古くてゆっくりともう使われていません。これは十分ではなく、Linuxネットワークスタックを完全に操作できません。

たとえば、ご存知のように、このコンピュータにifconfig割り当てる各IPにエイリアスインターフェイス(など)を作成する必要がありますeth0:0eth0:1これは255個のインターフェースエイリアスしか持てないので問題になります。 iproute2のコマンドを使用すると、ip単一のインターフェイスに必要な数のIPを割り当てることができます。

使用例:

# 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

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

関連情報