Bitte beachten Sie zunächst, dass die CPUID definitiv kein allgemein zugänglicher eindeutiger Identifizierungsmarker für ein späteres System als ein Intel Pentium III ist. Während das Hashing mit MAC-Adressen zweifellos zu eindeutigen Markierungen führen kann, liegt dies nur an den eindeutigen Eigenschaften der MACs selbst, und die CPUID ist in diesem Fall nichts weiter als ein Umstand. Darüber hinaus ist der resultierende Hash wahrscheinlich nicht eindeutiger als die UUID des Motherboards, und das ist weitaus einfacher abzurufen und der Prozess ist viel weniger fehleranfällig. Aus wikipedia.org/wiki/cpuid :
EAX = 3 : Prozessor-Seriennummer
Siehe auch: Pentium III § Kontroverse über Datenschutzfragen
Dies gibt die Seriennummer des Prozessors zurück. Die Prozessor-Seriennummer wurde bei Intel Pentium III eingeführt, aber aus Datenschutzgründen ist diese Funktion bei späteren Modellen nicht mehr implementiert (PSN-Funktionsbit wird immer gelöscht). Transmetas Efficeon- und Crusoe-Prozessoren bieten ebenfalls diese Funktion. AMD CPUs implementieren diese Funktion jedoch nicht in CPU-Modellen.
Sie können eine geparste CPU selbst anzeigen, indem Sie cat /proc/cpuinfo
oder sogar nur lscpu
.
Das gibt dir alle MAC-Adressen für die Netzwerkschnittstellen, die vom Linux-Kernel erkannt werden, denke ich:
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
Möglicherweise muss diese Liste gefiltert werden, wenn sie virtuelle Netzwerkkarten mit zufällig generierten MACs enthält. Dies können Sie mit Flags im Call to ip
direkt tun . Sehen Sie ip a help
Informationen darüber , wie dies zu tun.
Beachten Sie auch, dass dieses Problem nicht ip
nur bei Ihnen auftritt und behandelt werden muss ifconfig
, sondern dass es zuverlässiger gehandhabt werden kann ip
- was Teil der iproute2
Netzwerksuite ist und aktiv gewartet wird - als bei ifconfig
Mitgliedern des net-tools
Pakets und zuletzt eine Linux- Veröffentlichung im Jahr 2001 . Da sich die Funktionen im Kernel seit der letzten Veröffentlichung geändert haben , ifconfig
ist bekannt, dass einige Netzwerkfeature-Flags falsch gemeldet wurden, und die Verwendung sollte nach Möglichkeit vermieden werden.
Beachten Sie jedoch, dass das Filtern mit Kernel-Schnittstellennamen wie eth[0-9]
nicht zuverlässig ist, da sich diese je nach der Reihenfolge der parallelen Erkennung udev
während des Startvorgangs ändern können. Weitere Informationen hierzu finden Sie unter Vorhersagbare Netzwerknamen .
Da dmidecode
es nicht auf meinem System installiert ist, dachte ich zuerst, ich solle eine Liste von Festplatten-Serien erstellen, die wie folgt aussehen:
lsblk -nro SERIAL
Suchen Sie lsblk --help
nach Hinweisen zur Verfeinerung dieser Liste - beispielsweise nach Datenträgertyp. Überlegen Sie auch lspci
und / oder lsusb
vielleicht.
Sie zu kombinieren ist einfach:
{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
sha256sum #gets your hash
Wie Sie mir mitgeteilt haben, geben Sie die Ressourcen des Benutzers an Ihre eindeutigen IDs weiter, und es kann nicht davon ausgegangen werden, dass Festplatten existieren. Ich dachte, ich würde meine Einstellung ändern.
Dann habe ich noch einmal in das Dateisystem geschaut und den /sys/class/dmi/id
Ordner gefunden. Ich habe einige der Dateien überprüft:
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
Dieser scheint jedoch ziemlich gut zu sein, aber ich werde die Ausgabe nicht veröffentlichen:
sudo cat /sys/class/dmi/id/product_uuid
Ich gehe davon aus, dass dort dmidecode
sowieso viele Informationen abgerufen werden und dass es tatsächlich so aussieht . man dmidecode
Sie können Ihrer Meinung nach auch die Verwendung dieses Tools erheblich vereinfachen, indem Sie das Argument angeben:
dmidecode -s system-uuid
Noch einfacher ist jedoch, dass Sie die Datei einfach lesen können. Beachten Sie, dass diese bestimmte Datei speziell ein Motherboard identifiziert. Hier ist ein Auszug aus dem Kernel-Patch von 2007 , der diese Exporte ursprünglich in das /sysfs
virtuelle Dateisystem implementiert hat :
+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);
Möglicherweise können Sie diese Daten allein verwenden, um das System zu identifizieren - wenn das Motherboard ausreicht. Sie können diese Informationen jedoch auf die gleiche Weise mit den MACs des Systems kombinieren, wie dies bei Festplatten der Fall ist:
sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
cat /sys/class/dmi/id/product_uuid
CMD
Der Linux-Kernel kann auch UUIDs für Sie generieren:
cat /proc/sys/kernel/random/uuid #new random uuid each time file is read
Oder:
cat /proc/sys/kernel/random/boot_id #randomly generated per boot
Zugegeben, es ist zufällig generiert und Sie werden umdenken ID - Zuweisung haben, aber es ist ungefähr so einfach , wie es zu bekommt bekommen zumindest. Und es sollte ziemlich solide sein, wenn Sie ein Mittel finden, um es zu tasten.
Auf UEFI-Systemen wird dies erheblich einfacher, da jede EFI-Firmware-Umgebungsvariable eine eigene UUID enthält. Die Umgebungsvariable {Platform,}LangCodes-${UUID}
sollte auf jedem UEFI-System vorhanden sein, Neustarts und sogar die meisten Firmware-Upgrades und -Änderungen sollten beibehalten werden , und jedes Linux-System mit efivarfs
geladenem Modul kann einen oder beide Namen so einfach wie folgt auflisten :
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
Die ältere Form - LangCodes-${UUID}
ist anscheinend mittlerweile veraltet und sollte auf neueren Systemen vorhanden sein, PlatformLangCodes-${UUID}
aber laut Spezifikation sollte die eine oder andere in jedem UEFI-System vorhanden sein. Mit wenig Aufwand können Sie Ihre eigenen persistenten Variablen für den Neustart definieren und auf diese Weise möglicherweise den UUID-Generator des Kernels besser nutzen. Bei Interesse schauen Sie in efitools .