bash를 사용하여 MAC 주소를 링크 로컬 주소로 변환

bash를 사용하여 MAC 주소를 링크 로컬 주소로 변환

Mac 주소를 ipv6 링크 로컬 주소로 변환하는 방법은 무엇입니까?

fe80::처음에 추가하고 ff:fe중간에 삽입해야 합니다 .

또한 모든 선행 0을 제거해야 합니다.

답변1

IFSMAC 주소를 콜론으로 구분된 6개의 그룹으로 분할하고 결합 할 수 있습니다 . 또한 일곱 번째로 중요한 비트를 뒤집어야 합니다(감사합니다.바하마), 이는 첫 번째 바이트의 비트 1입니다.

mac_to_ipv6 () {
  IFS=':'; set $1; unset IFS
  ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}

접두사와 접미사를 사용하여 구조를 제거할 수 있습니다.${VAR#PREFIX}그리고${VAR%SUFFIX}MAC 주소를 여러 조각으로 자릅니다.

mac_to_ipv6 () {
  mac=$1
  ipv6_address=fe80::$(printf %02x $((0x${mac%%:*} ^ 2)))
  mac=${mac#*:}
  ipv6_address=$ipv6_address${mac%:*:*:*}ff:fe
  mac=${mac#*:*:}
  ipv6_address=$ipv6_address${mac%:*}${mac##*:}
}

하위 문자열 구성을 사용할 수 있습니다(sh가 아닌 bash만).

mac_to_ipv6 () {
  local mac=$1 byte0
  printf %02x -v byte0 $((0x${mac:0:2} ^ 2))
  ipv6_address="fe80::$byte0${mac:3:5}ff:fe${mac:9:5}${mac:15:2}"
}

답변2

Gilles의 설명을 받아들이지만 정확합니다.IPv6 사양에 따라 비트 7을 뒤집습니다.:

#!/bin/bash

IFS=':'; set $1; unset IFS
printf "fe80::%x%x:%x:%x:%x\n" 0x$(( 0x${1} ^ 0x02 )) 0x${2} 0x${3}ff 0xfe${4} 0x${5}${6}

비트 뒤집기의 예:

$ mac_to_ipv6 00:00:00:00:00:00
fe80::200:00ff:fe00:0000

답변3

IFSMAC 주소를 콜론으로 구분된 6개의 그룹으로 분할하고 결합하는 기능을 만들 수 있습니다 . 또한 첫 번째 바이트의 비트 1인 7번째 최상위 비트(bahamat에게 감사)를 뒤집어야 합니다.

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

관련 정보