uuuidgen과 같이 각 PC에 대해 고유 ID를 생성할 수 있지만 하드웨어가 변경되지 않는 한 절대 변경되지 않습니까? CPUID와 MACADDR을 병합하고 해싱하여 일관된 ID를 생성하려고 하는데 bash 스크립트를 사용하여 구문 분석하는 방법을 모르겠습니다. 제가 아는 것은 CPUID를 얻는 방법뿐입니다.
dmidecode -t 4 | grep ID
그리고
ifconfig | grep ether
그런 다음 이러한 16진수 문자열을 결합하고 sha1 또는 md5를 사용하여 해시하여 고정 길이 16진수 문자열을 생성해야 합니다.
이 출력을 어떻게 구문 분석합니까?
답변1
이 두 가지는 어떻습니까?
$ sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g'
52060201FBFBEBBF
$ ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g'
0126c9da2c38
그런 다음 이를 결합하고 해시할 수 있습니다.
$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
$(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f -
후행 대시를 제거하려면 다른 파이프를 추가하십시오.
$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
$(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum |
awk '{print $1}'
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f
@mikeserv가 지적했듯이그의 대답에, 인터페이스 이름교환 가능부츠 사이. 즉, 오늘의 eth0이 내일의 eth1이 될 수 있으므로 grep을 수행하면 eth0
다른 부팅에서 다른 MAC 주소를 얻을 수 있습니다. 내 시스템에는 이러한 동작이 없으므로 실제로 테스트할 수는 없지만 가능한 해결 방법은 다음과 같습니다.
grep for
HWaddr
의 출력은ifconfig
특정 네트워크 카드에 해당하는 것뿐만 아니라 모든 것을 유지합니다. 예를 들어 내 시스템에는 다음이 있습니다.$ ifconfig | grep HWaddr eth1 Link encap:Ethernet HWaddr 00:24:a9:bd:2c:28 wlan0 Link encap:Ethernet HWaddr c4:16:19:4f:ac:g5
두 개의 MAC 주소를 가져와서 다음으로 전달하면
sha256sum
어떤 NIC의 이름이 무엇이든 상관없이 고유하고 안정적인 이름을 얻을 수 있습니다 .$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \ $(ifconfig | grep -oP 'HWaddr \K.*' | sed 's/://g') | sha256sum | awk '{print $1}' 662f0036cba13c2ddcf11acebf087ebe1b5e4044603d534dab60d32813adc1a5
ifconfig
에서 반환한 두 개의 MAC 주소를 전달했기 때문에 해시는 위와 다릅니다sha256sum
.하드 드라이브의 UUID를 기반으로 해시를 생성합니다.
$ blkid | grep -oP 'UUID="\K[^"]+' | sha256sum | awk '{print $1}' 162296a587c45fbf807bb7e43bda08f84c56651737243eb4a1a32ae974d6d7f4
답변2
먼저 CPUID는 다음과 같아야 합니다.아니요Intel Pentium III 이후의 모든 시스템에 적용할 수 있는 보편적인 고유 식별 표시입니다. MAC 주소로 해싱하면 확실히 고유한 서명이 생성되지만 이는 MAC 자체의 고유한 품질 때문일 뿐이며 이 경우 CPUID는 환경적 요인에 지나지 않습니다. 또한 결과 해시는 마더보드의 UUID보다 고유하지 않을 가능성이 높으며 검색하기 쉽고 프로세스에서 오류가 발생할 가능성이 적습니다. ~에서wikipedia.org/wiki/cpuid:
EAX=3: 프로세서 일련 번호
또한보십시오:펜티엄 III § 개인 정보 보호 논란
그러면 프로세서의 일련 번호가 반환됩니다. 프로세서 일련 번호는 Intel Pentium III에 도입되었지만 개인 정보 보호 문제로 인해 이 기능은 후속 모델에서는 더 이상 구현되지 않습니다(PSN 기능 비트는 항상 지워집니다). Transmeta의 Efficeon 및 Crusoe 프로세서도 이 기능을 제공합니다. 그러나 AMD CPU는 어떤 CPU 모델에서도 이 기능을 구현하지 않습니다.
cat /proc/cpuinfo
CPUID를 실행하거나 보기만 해도 스스로 확인할 수 있습니다 lscpu
.
그러면 Linux 커널이 인식하는 네트워크 인터페이스의 모든 MAC 주소가 제공됩니다.
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
무작위로 생성된 MAC이 있는 가상 네트워크 카드가 포함될 가능성이 있는 경우 목록을 필터링해야 할 수도 있습니다. 직접 호출에서 플래그를 사용하여 이를 수행할 수 있습니다 ip
. ip a help
이를 수행하는 방법에 대한 정보는 참고자료를 참조하십시오.
또한 이 문제는 고유한 것이 아니며 를 ip
사용하는 경우 처리해야 ifconfig
하지만 보다 안정적으로 처리할 수 있습니다 ip
.iproute2
네트워크 제품군그리고 적극적으로 유지하는 것보다 더 나은 것은 ifconfig
다음과 같습니다.net-tools
팩Linux에서 마지막으로 확인됨2001년 출시. 마지막 릴리스 이후 커널의 기능 변경으로 인해 ifconfig
다음과 같이 알려져 있습니다 .일부 네트워크 기능 플래그에 대한 오탐지가능하면 사용을 피해야 합니다.
그러나 커널 인터페이스 이름을 사용한 필터링은 부팅 중 병렬 감지 순서에 따라 eth[0-9]
이름이 변경될 수 있으므로 신뢰할 수 있는 방법이 아니라는 점을 이해하시기 바랍니다. udev
보다예측 가능한 네트워크 이름이에 대해 자세히 알아보세요.
내 시스템에 설치되지 않았기 때문에 dmidecode
먼저 생성된 하드 드라이브 일련 번호 목록을 다음과 같이 해싱하려고 생각했습니다.
lsblk -nro SERIAL
lsblk --help
예를 들어 디스크 유형별로 목록을 구체화하는 방법에 대한 몇 가지 단서를 찾으세요 . 또한 고려 lspci
및/또는 lsusb
아마도.
그것들을 결합하는 것은 쉽습니다:
{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
sha256sum #gets your hash
사용자의 리소스를 고유 ID에 바인딩하고 하드 드라이브의 존재 여부에 의존할 수 없다고 말씀하셨기 때문에 전략을 바꾸고 싶습니다.
이를 염두에 두고 파일 시스템을 다시 살펴보며 /sys/class/dmi/id
폴더를 찾았습니다. 일부 파일을 확인했습니다.
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
그러나 이것은 꽤 좋아 보이지만 출력은 게시하지 않겠습니다.
sudo cat /sys/class/dmi/id/product_uuid
여기가 대부분의 정보를 얻을 수 있는 곳이기를 바랍니다 dmidecode
. 실제로는정말 이렇게 생겼어요. ~에 따르면man dmidecode
매개변수를 지정하여 이 도구의 사용을 크게 단순화할 수도 있습니다.
dmidecode -s system-uuid
하지만 더 쉽게는 파일을 읽을 수 있습니다. 이 특정 파일은 마더보드를 구체적으로 식별합니다. 이것은 에서 발췌한 것입니다.2007 커널 패치/sysfs
처음에는 가상 파일 시스템으로의 내보내기가 구현되었습니다 .
+DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor, 0444, DMI_BIOS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_version, 0444, DMI_BIOS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_date, 0444, DMI_BIOS_DATE);
+DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor, 0444, DMI_SYS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(product_name, 0444, DMI_PRODUCT_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(product_version, 0444, DMI_PRODUCT_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(product_serial, 0400, DMI_PRODUCT_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(product_uuid, 0400, DMI_PRODUCT_UUID);
+DEFINE_DMI_ATTR_WITH_SHOW(board_vendor, 0444, DMI_BOARD_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(board_name, 0444, DMI_BOARD_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(board_version, 0444, DMI_BOARD_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(board_serial, 0400, DMI_BOARD_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(board_asset_tag, 0444, DMI_BOARD_ASSET_TAG);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_vendor, 0444, DMI_CHASSIS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_type, 0444, DMI_CHASSIS_TYPE);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_version, 0444, DMI_CHASSIS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_serial, 0400, DMI_CHASSIS_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_asset_tag, 0444, DMI_CHASSIS_ASSET_TAG);
마더보드가 충분한 경우 이 데이터만 사용하여 시스템을 식별할 수 있습니다. 하지만 하드 드라이브에 대해 설명했듯이 이 정보를 시스템의 MAC와 결합할 수 있습니다.
sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
cat /sys/class/dmi/id/product_uuid
CMD
Linux 커널은 UUID를 생성할 수도 있습니다.
cat /proc/sys/kernel/random/uuid #new random uuid each time file is read
또는:
cat /proc/sys/kernel/random/boot_id #randomly generated per boot
물론 무작위로 생성되는 것이므로 ID 할당을 다시 생각해야 하지만 꽤 간단합니다.얻다적어도. 잠그는 방법을 찾을 수 있다면 꽤 견고할 것입니다.
마지막으로 UEFI 시스템에서는 각 EFI 펌웨어 환경 변수에 고유한 UUID가 포함되어 있으므로 이것이 더 쉽습니다. 환경 변수는 {Platform,}LangCodes-${UUID}
모든 UEFI 시스템에 존재해야 하며 재부팅 후에도 지속되어야 합니다.최대펌웨어 업그레이드 및 수정의 경우 efivarfs
이 모듈이 로드된 Linux 시스템은 다음과 같이 이러한 이름 중 하나 또는 둘 다를 나열할 수 있습니다.
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
이전 형식 - LangCodes-${UUID}
분명히이제 더 이상 사용되지 않음, 최신 시스템에서는 이어야 PlatformLangCodes-${UUID}
하지만 사양에 따르면 이들 중 하나가 모든 UEFI 시스템에 있어야 합니다. 아주 적은 노력으로도 자신만의 재부팅 지속 변수를 정의하고 커널의 UUID 생성기를 더 많이 활용할 수 있습니다. 관심있으신 분들은 한번 살펴보시면 좋을 것 같아요에페 도구.
답변3
/etc/machine-id
많은 최신 배포판에는 고유한 16진수 32자 문자열이 포함된 파일이 함께 제공됩니다 . 이는 systemd에서 파생됩니다.맨페이지에 더 많은 정보가 포함되어 있습니다., 귀하의 목적에 적합할 수 있습니다.
답변4
하드웨어가 변경되면 컴퓨터 ID를 변경해야 합니까? 컴퓨터 ID가 무언가를 보호하는 데 사용됩니까? "일관된" 컴퓨터 ID를 갖는 가장 좋은 방법은 하드웨어가 변경되더라도 컴퓨터 ID가 변경되지 않도록 시스템 어딘가에 임의의 문자열을 저장하는 것입니다. 이는 하드웨어 액세스가 제한되고 MAC ID가 00:00:00:00인 가상화된 시스템에도 유용합니다.
sh 스크립트와 같은 것을 시도하여 ID를 만들고 가져옵니다.
#!/bin/sh
FILE="/etc/machine-id"
if [ ! -f $FILE ]; then
cat /dev/urandom|tr -dc A-Z0-9|head -c32 > $FILE;
fi
cat $FILE;