
這將在 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
細節
好吧,看起來這裡發生了很多事情,但它非常簡單。
- if 語句 - 最初我們需要知道是否存在任何乙太網路設備,因此我們運行
ifconfig
並 grep 輸出尋找一個。如果我們找到一個,那麼我們將ifconfig
再次運行並解析它。 - 第二個 ifconfig - 我們現在實際上正在解析輸出。我們使用 的
grep
PCRE 工具 (-P
) 來搜尋以 ethXX: 開頭的字串。交換器-o
將會傳回 ethXX: 之後出現的數字。 - 排序 - 然後我們
sort
以數字形式顯示結果,以防我們有多個 ethXX:YY 設備。 - tail - 返回最後一個,這將是價值最高的 ethXX:YY 設備。
- 然後我們透過 增加這個數字
$(( $(ifconfig ...) + 1 ))
。因此,如果 ethXX:YY 為 0,我們將得到0 + 1
一個1
. - echo - 然後我們得到
echo
第 5 步的結果。 - 如果輸出中不存在 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:0
。eth0:1
這是一個問題,因為您只能有 255 個介面別名。使用ip
iproute2 中的指令,您可以為單一介面指派任意數量的 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
除了名稱之外,您不需要了解有關介面目前配置的任何資訊。無需計算下一個未使用的介面別名號。