Po pierwsze, należy pamiętać, że CPUID zdecydowanie nie jest powszechnie dostępnym, jednoznacznie identyfikującym markerem dla jakiegokolwiek systemu późniejszego niż Intel Pentium III. Chociaż mieszanie go z adresami MAC może z pewnością prowadzić do unikalnych znaczników, jest to spowodowane jedynie unikalnymi cechami samych MAC, a CPUID w tym przypadku jest niczym więcej jak tylko poszlakami. Co więcej, wynikowy skrót nie jest bardziej unikalny niż UUID płyty głównej, i jest to znacznie łatwiejsze do odzyskania, a proces jest znacznie mniej podatny na błędy. Z wikipedia.org/wiki/cpuid :
EAX = 3 : Numer seryjny procesora
Zobacz też: Pentium III § Kontrowersje dotyczące kwestii prywatności
Zwraca numer seryjny procesora. Numer seryjny procesora został wprowadzony na Intel Pentium III, ale ze względu na obawy dotyczące prywatności ta funkcja nie jest już implementowana w późniejszych modelach (bit funkcji PSN jest zawsze czyszczony). Procesory Efficeon i Crusoe firmy Transmeta również zapewniają tę funkcję. Jednak procesory AMD nie implementują tej funkcji w żadnym modelu procesora.
Możesz zobaczyć sparsowany cpuid sam, robiąc cat /proc/cpuinfo
lub nawet po prostu lscpu
.
To daje ci wszystkie adresy MAC interfejsów sieciowych rozpoznawanych przez jądro Linuksa, tak myślę:
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
Może być konieczne odfiltrowanie tej listy, jeśli może ona zawierać wirtualne karty sieciowe z losowo generowanymi adresami MAC. Możesz to zrobić bezpośrednio z flagami w wywołaniu ip
. Zobacz, ip a help
jak to zrobić.
Należy również pamiętać, że ten problem nie jest unikalny ip
i należy go rozwiązać, jeśli go używasz ifconfig
, ale że można go bardziej pewnie rozwiązać ip
- który jest częścią iproute2
pakietu sieciowego i jest aktywnie utrzymywany - niż może ifconfig
- który jest członkiem z net-tools
opakowania i ostatni zobaczył Linux kin w 2001 roku . Ze względu na zmieniające się funkcje jądra od czasu jego ostatniego wydania, ifconfig
jest to znane misreport jakieś flagi funkcji sieci i jej stosowanie należy unikać, jeśli to w ogóle możliwe.
Zrozum jednak, że filtrowanie za pomocą nazw interfejsów jądra, takich jak, eth[0-9]
nie jest niezawodnym sposobem, aby to zrobić, ponieważ mogą się one zmieniać w zależności od kolejności równoległego wykrywania udev
podczas procesu rozruchu. Więcej informacji na ten temat można znaleźć w części Przewidywalne nazwy sieciowe .
Ponieważ dmidecode
nie jest zainstalowany w moim systemie, na początku pomyślałem o utworzeniu listy numerów seryjnych dysków twardych, takich jak:
lsblk -nro SERIAL
Zrób lsblk --help
kilka wskazówek na temat dopracowywania tej listy - powiedzmy według typu dysku. Weź również pod uwagęlspci
i / lub lsusb
może.
Łączenie ich jest łatwe:
{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
sha256sum #gets your hash
Jak już poinformowałeś mnie, że kluczujesz zasoby użytkownika na jego unikalne identyfikatory, a na dyskach twardych nie można polegać, że istnieją, pomyślałem o zmianie halsu.
Biorąc to pod uwagę, ponownie spojrzałem na system plików i znalazłem /sys/class/dmi/id
folder. Sprawdziłem kilka plików:
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
Jednak ten wydaje się być całkiem dobry, ale nie opublikuję wyniku:
sudo cat /sys/class/dmi/id/product_uuid
Spodziewam się, że i tak dmidecode
dostaje większość swoich informacji i tak naprawdę to wygląda . Według man dmidecode
Ciebie możesz również znacznie uprościć korzystanie z tego narzędzia, podając argument:
dmidecode -s system-uuid
Jeszcze prościej, możesz po prostu odczytać plik. Pamiętaj, że ten konkretny plik konkretnie identyfikuje płytę główną. Oto fragment poprawki do jądra z 2007 r., Która pierwotnie implementowała te eksporty do /sysfs
wirtualnego systemu plików:
+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);
Możesz użyć tych danych samodzielnie do identyfikacji systemu - jeśli płyta główna jest wystarczająca. Ale możesz połączyć te informacje z MAC systemu w taki sam sposób, jak pokazałem, że możesz zrobić z dyskami twardymi:
sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
cat /sys/class/dmi/id/product_uuid
CMD
Jądro Linux może również generować dla Ciebie UUID:
cat /proc/sys/kernel/random/uuid #new random uuid each time file is read
Lub:
cat /proc/sys/kernel/random/boot_id #randomly generated per boot
To prawda, to generowany losowo i trzeba będzie przemyśleć cesji osobistego, ale tu chodzi o tak proste, jak to robi się dostać przynajmniej. I powinno być całkiem solidne, jeśli możesz znaleźć sposób, aby to kluczować.
Wreszcie w systemach UEFI jest to o wiele łatwiejsze - ponieważ każda zmienna środowiskowa oprogramowania układowego EFI zawiera własny identyfikator UUID. Zmienna środowiskowa {Platform,}LangCodes-${UUID}
powinna być obecna w każdym systemie UEFI, powinna trwać ponowne uruchamianie, a nawet większość aktualizacji i modyfikacji oprogramowania układowego, a każdy system Linux z efivarfs
załadowanym modułem może wyświetlać jedną lub obie nazwy tak po prostu:
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
Starsza forma - LangCodes-${UUID}
najwyraźniej jest teraz przestarzała i na nowszych systemach powinna być, PlatformLangCodes-${UUID}
ale zgodnie ze specyfikacją, jedno lub drugie powinno być obecne w każdym systemie UEFI. Przy niewielkim wysiłku możesz zdefiniować własne zmienne trwałe przy ponownym uruchomieniu komputera i być może w ten sposób lepiej wykorzystać generator UUID jądra. W razie zainteresowania zajrzyj do efitools .