MACアドレスを使用して、たとえばネットワーク内で一意である必要があるリンクローカルIPv6アドレスなどのインターフェイス識別子を作成できることはわかっています。
画像はこれを行う方法を示しています:
私の質問は:
awk
またはを使用してMACからIPv6アドレスを作成するにはどうすればよいsed
ですか?- または、特定のMAC(そのようなもの
createIPv6 myMAC
)のリンクローカルIPv6アドレスを取得するコマンドはありますか?
MACアドレスを使用して、たとえばネットワーク内で一意である必要があるリンクローカルIPv6アドレスなどのインターフェイス識別子を作成できることはわかっています。
画像はこれを行う方法を示しています:
私の質問は:
awk
またはを使用してMACからIPv6アドレスを作成するにはどうすればよいsed
ですか?createIPv6 myMAC
)のリンクローカルIPv6アドレスを取得するコマンドはありますか?回答:
MAC(および特定のプレフィックス)からIPv6アドレス全体を作成する場合はipv6calc
、Peter Bieringerの優れたツールを使用できます。
次のコマンドはfe80::
、MACアドレスからリンクローカルIPv6アドレス(プレフィックス)を作成します。
$ ipv6calc --action prefixmac2ipv6 --in prefix+mac --out ipv6addr fe80:: 00:21:5b:f7:25:1b
fe80::221:5bff:fef7:251b
ほとんどのオプションを省略して、コマンドに何をすべきかを推測させることができます。
$ ipv6calc --in prefix+mac fe80:: 00:21:5b:f7:25:1b
No action type specified, try autodetection...found type: prefixmac2ipv6
fe80::221:5bff:fef7:251b
Debianディストリビューションの場合ipv6calc
、メインリポジトリにあります。
IPv6のWikipediaのエントリよりテキスト形式の説明:
64ビットのインターフェイス識別子は、最も一般的には48ビットのMACアドレスから取得されます。
MACアドレス00:0C:29:0C:47:D5は、中央にFF:FE:00:0C:29:FF:FE:0C:47:D5を挿入することにより、64ビットEUI-64に変換されます。
したがって、3番目:
をで置き換えると:FF:FE:
、トリックが実行されます。
echo 00:0C:29:0C:47:D5 | sed s/:/:FF:FE:/3
00:0C:29:FF:FE:0C:47:D5
その構文がGNU sedに固有のものかどうかはわかりません。
進行中の作業:
それをビットに変換します。
for HEX in $(tr ":" " " <<< 00:0C:29:FF:FE:0C:47:D5)
do
printf "%08d " $(bc <<< "ibase=16;obase=2;$HEX")
done
ビット00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101
はビット番号7の反転のみを残す結果になります。
#! /usr/bin/env python
import sys
n=[int(x, 16) for x in sys.argv[1].split(":")]
print "fe80::%02x%02x:%02xff:fe%02x:%02x%02x" % tuple([n[0]^2]+n[1:])
を使用してMACアドレスを6つのコロンで区切られたグループに分割し、それらをアセンブルするbash関数を作成(およびに配置~/.bashrc
)IFS
できます。また、7番目の最上位ビット、つまり最初のバイトのビット1を反転する必要があります。
mac_to_ipv6_ll() {
IFS=':'; set $1; unset IFS
echo "fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}
使用例:
$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012
私が探していた上記の純粋なシェル(printfを数えない限り)の答えについては、上記の@ rubo77に賞賛を与える必要があります。
これにより、sedが少し追加されます。
(a)各16ビットチャンクの先行ゼロを削除します。そして
(b)IIDの開始時にさらにすべてゼロのチャンクを排除する
...アドレスを簡潔にするための一般的な規則に従って。
mac_to_eui64() {
IFS=':'; set $1; unset IFS
echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}
これを他の(任意の)プレフィックスに転用したい場合は、EUI-64を任意のスコープで使用できるため(プライバシー上の理由から、グローバルアドレスには使用しないことをお勧めします)、少しだけ必要になることに注意してください。より複雑なsedスクリプト。これは、fe80::
プレフィックスには、IIDの先頭に隣接する3つのゼロチャンク(ダブルコロンで省略)が既に含まれているためです。したがって、IIDの最初のチャンクがすべてゼロである場合(つまり、MACがで始まっている場合02:00
)でも、それは省略されます。EUI-64形式では、すべてゼロになる可能性のある1つのチャンク(最後のチャンク)のみが残され、上記のスクリプトで単一のゼロとして追加されます。他の接頭辞では、2つのコロンの間に1つのゼロを残す必要があります。
printf
一人にして、代わりにsedで追加のことをしました。