입력하다:
dmesg | grep [0-9][0-9]:[0-9][0-9]
f0:de:f1:11:22:33
...
산출:
dmesg | SOMEMAGIC | grep [0-9][0-9]:[0-9][0-9]
f0:de:f1:52:22:17
...
"52:22:17"은 어떻게 얻었나요?
echo 11:22:33 | cksum | sed "s/.\{2\}/&:/g" | cut -d: -f-3
52:22:17
이렇게 하면 출력을 제공해야 할 때 MAC 주소 NIC 특정 문자열을 "감사"할 수 있습니다 dmesg
. ("SOMEMAGIC" dmesg
은 AND 예약된 모든 MAC에 대해 이 작업을 자동으로 수행하는 마법입니다 (NIC 특정 문자열, 다른 문자열로 대체). 예: wlan0 MAC는 X , wlan1 MAC는 Y)
질문:출력에서 NIC별 MAC 주소 문자열을 검사하면서 dmesg
서로 다른 MAC 주소가 여러 개 있을 가능성을 유지하려면 어떻게 해야 합니까?
업데이트#1: "내" 방식으로, 예에 표시된 대로 약 1,600만 행(16*16 * 16*16 * 16*16 = 16^2 = 16,777,216)이 있는 테이블을 생성할 수 있습니다. 원래 MAC이 무엇인지 알아낼 수 있기 때문에 좋지 않습니다!
업데이트#2: 솔루션은 대소문자를 구분해야 하므로 MAC가 대문자인지 소문자인지는 중요하지 않습니다.
답변1
대소문자를 구분하지 않는 Mac 주소 의 경우 grep
더 나은 일치를 얻으려면 16진수 값과 일치하도록 패턴을 확장하고 6개의 16진수 문자 쌍과 모두 일치하도록 양수를 줄여야 합니다.
dmesg | grep -i [0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]
바꾸다어느여러 번 나타날 수 있는 MAC의 수, 무작위, 무작위안 돼요(다른) MAC을 일치시키려면 먼저 이것이 목록 L이라고 가정하고 dmesg 출력 텍스트에 나타나는 다른 MAC을 모두 알아야 합니다. 그런 다음 L의 각 요소를 L에 없는 임의의 MAC에 매핑하고 매핑에 따라 각 MAC 주소를 교체합니다.
나는 초보자도 아니지만 awk
위의 요구 사항은 그것의 능력을 넘어서는 것이라고 생각합니다. 나는 python/ruby/perl에서 이와 같은 작업을 진지하게 고려할 것입니다.
하지만 출력에 MAC 주소만 있고 dmesg
전역적으로 고유한 OUI(Organizational Unique Identifier) 비트가 설정된 경우에는 바로가기가 있을 수 있습니다. 이는 첫 번째 16진수 문자에 비트 1(1)이 설정된 문자입니다(즉, 값은 2
, 3
, 6
, 7
, a
, b
, e
, f
). 이는 공식적으로 출시된 하드웨어의 경우 정상적인 현상입니다. 이 경우 각 MAC 주소를 "로컬 관리" MAC 주소(비트 1 지우기)에 매핑하면 임의의 MAC 주소(비트 1 지우기)가 기존 MAC 주소와 일치하는지 걱정할 필요가 없습니다. 이 경우 실제 MAC에서 발생할 수 있는 무작위 충돌을 버퍼링하는 대신 매핑(나중에 파일에서 발생하는 작업)을 유지하기만 하면 됩니다. 이 제한은 예를 들어 요구 사항을 구현할 수
있도록 프로그램을 단순화하는 데 충분할 수 있습니다 (더 제한적인 경우에는 달성할 수 없다고 가정).awk
6바이트 MAC-48의 사용은 8바이트 EUI-64 식별자에 의해 "확장"되었습니다. 나는 이것을 직접 본 적이 없지만 출력물에 나타날 수 있습니다 dmesg
.
어려운 상황을 처리하는 Python 프로그램:
#! /usr/bin/env python
# coding: utf-8
import sys
import re
import io
from random import randint
MAC48_REGEX = re.compile(r"""
(?x)(?i) # free spacing mode, ignore case
([0-9A-F]{2}[:-]){5} # five times two hex-characters, followed by : or -
([0-9A-F]{2}) # final two hex-characters
""")
class MatchMAC48(object):
MAX_MAC = 256 ** 6 - 1
def __init__(self):
self._mac_map = {}
self._buffer = io.StringIO()
def __call__(self, line):
"""analyse the input for input MAC addresses and store them"""
self._buffer.write(line)
res = MAC48_REGEX.search(line)
if not res:
return line # no MACs
index = 0
while res:
self._mac_map[res.group()] = None
index += res.span()[1]
res = MAC48_REGEX.search(line[index:])
def generate_map(self):
"""generate a unique mapping MAC for each of the MAC address keys"""
for k in self._mac_map:
if self._mac_map[k] is not None:
continue
r = None
while (r is None or
r in self._mac_map or # not an original MAC
r in self._mac_map.values()): # twice the same random MAC
r = randint(0, self.MAX_MAC)
ml = []
for i in range(6):
ml.insert(0, u'{:02x}'.format(r & 255))
r >>= 8
self._mac_map[k] = u':'.join(ml)
def dump(self, fp=sys.stdout):
"""dump the cached StringIO buffer"""
mm48.generate_map() # in case not yet generated
x = self._buffer.getvalue()
for k in self._mac_map:
x = x.replace(k, self._mac_map[k])
fp.write(x)
mm48 = MatchMAC48()
for line in sys.stdin:
mm48(line.decode('utf-8'))
mm48.dump()