dmesg 출력에서 ​​MAC를 검사하는 방법은 무엇입니까?

dmesg 출력에서 ​​MAC를 검사하는 방법은 무엇입니까?

입력하다:

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()

관련 정보