これは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
詳細
まあ、ここでは多くのことが起こっているように見えますが、とても簡単です。
- if ステートメント - 最初は次のようなものかどうかを知る必要があります。どのイーサネットデバイスなので、出力を実行し
ifconfig
てgrepしてデバイスを見つけます。 1つが見つかったら、ifconfig
もう一度実行して解析します。 - 2番目のifconfig - 実際に出力を解析しています。
grep
PCREツール()を使用して、-P
ethXX:で始まる文字列を検索します。スイッチは-o
ethXX:の後に表示される番号を返します。 - 並べ替え -
sort
ethXX:YY デバイスが複数ある場合、結果を数値で表示します。 - tail - 最も高い値の ethXX:YY デバイスになる最後のデバイスを返します。
- その後、この数字を増やして増やします
$(( $(ifconfig ...) + 1 ))
。したがって、ethXX:YYが0の場合は0 + 1
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個のインターフェースエイリアスしか持てないので問題になります。 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
名前に加えて、インターフェイスの現在の設定について何も知る必要はありません。未使用の次のインターフェイスエイリアス番号を計算する必要はありません。