使用 ifconfig eth:xx 新增 IP 時,如何在一行中找到最高的 eth:xx

使用 ifconfig eth:xx 新增 IP 時,如何在一行中找到最高的 eth:xx

這將在 Perl 腳本中,我需要獲取該數字並為新 IP 將其加一。有人送我內襯嗎?可以是 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 設備。

那如果我們使用 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 輸出尋找一個。如果我們找到一個,那麼我們將ifconfig再次運行並解析它。
  2. 第二個 ifconfig - 我們現在實際上正在解析輸出。我們使用 的grepPCRE 工具 ( -P) 來搜尋以 ethXX: 開頭的字串。交換器-o將會傳回 ethXX: 之後出現的數字。
  3. 排序 - 然後我們sort以數字形式顯示結果,以防我們有多個 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

這不是對您問題的直接答案,而是更多的替代解決方案。

替代解決方案是使用ip路由2公用事業。ifconfig是古老的並且慢慢被棄用。它是不夠的,並且無法完全操縱 Linux 網路堆疊。

例如,如您所知ifconfig,您必須為要指派給該電腦的每個 IP 建立一個別名介面( 、 等)eth0:0eth0:1這是一個問題,因為您只能有 255 個介面別名。使用ipiproute2 中的指令,您可以為單一介面指派任意數量的 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

除了名稱之外,您不需要了解有關介面目前配置的任何資訊。無需計算下一個未使用的介面別名號。

相關內容