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/cpuinfooder 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 ipdirekt tun . Sehen Sie ip a helpInformationen darüber , wie dies zu tun.
Beachten Sie auch, dass dieses Problem nicht ipnur bei Ihnen auftritt und behandelt werden muss ifconfig, sondern dass es zuverlässiger gehandhabt werden kann ip- was Teil der iproute2Netzwerksuite ist und aktiv gewartet wird - als bei ifconfigMitgliedern des net-toolsPakets und zuletzt eine Linux- Veröffentlichung im Jahr 2001 . Da sich die Funktionen im Kernel seit der letzten Veröffentlichung geändert haben , ifconfigist 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 udevwährend des Startvorgangs ändern können. Weitere Informationen hierzu finden Sie unter Vorhersagbare Netzwerknamen .
Da dmidecodees 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 --helpnach Hinweisen zur Verfeinerung dieser Liste - beispielsweise nach Datenträgertyp. Überlegen Sie auch lspciund / oder lsusbvielleicht.
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/idOrdner 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 dmidecodesowieso viele Informationen abgerufen werden und dass es tatsächlich so aussieht . man dmidecodeSie 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 /sysfsvirtuelle 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 efivarfsgeladenem 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 .