Können wir für jeden PC eine eindeutige ID generieren, etwa "uuuidgen", die sich jedoch nur ändert, wenn Änderungen an der Hardware vorgenommen werden? Ich habe darüber nachgedacht, CPUID und MACADDR zusammenzuführen und zu hashen, um eine konsistente ID zu generieren, aber ich habe keine Ahnung, wie ich sie mit Bash-Skripten analysieren kann. Ich weiß, wie ich die CPUID erhalten kann
dmidecode -t 4 | grep ID
und
ifconfig | grep ether
dann muss ich diese hexadezimalen Zeichenfolgen kombinieren und sie mit sha1 oder md5 hashen, um Hexadezimale Zeichenfolgen mit fester Länge zu erstellen.
Wie kann ich diese Ausgabe analysieren?
bash
-, um unter Linux eine UUID zu generieren.cat /proc/sys/kernel/random/uuid
.Antworten:
Wie wäre es mit diesen beiden:
Sie können sie dann kombinieren und hashen mit:
Fügen Sie eine weitere Pipe hinzu, um den abschließenden Gedankenstrich zu entfernen:
Wie @mikeserv in seiner Antwort betont , kann sich der Schnittstellenname zwischen den Starts ändern . Das bedeutet, dass das, was heute eth0 ist, morgen eth1 sein kann. Wenn Sie also danach suchen, erhalten
eth0
Sie möglicherweise eine andere MAC-Adresse für verschiedene Starts. Mein System verhält sich nicht so, so dass ich nicht wirklich testen kann, aber mögliche Lösungen sind:Greifen Sie auf
HWaddr
die Ausgabe von zu,ifconfig
aber behalten Sie alle bei, nicht nur die, die einer bestimmten Netzwerkkarte entspricht. Zum Beispiel habe ich auf meinem System:Wenn Sie beide MAC-Adressen abrufen und weiterleiten
sha256sum
, sollten Sie in der Lage sein, einen eindeutigen und stabilen Namen zu erhalten, unabhängig davon, welche NIC wie heißt:Beachten Sie, dass sich der Hash von den oben genannten unterscheidet, da ich beide MAC-Adressen übergebe, die von
ifconfig
an zurückgegeben wurdensha256sum
.Erstellen Sie stattdessen einen Hash basierend auf den UUIDs Ihrer Festplatte (n):
quelle
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 :
Sie können eine geparste CPU selbst anzeigen, indem Sie
cat /proc/cpuinfo
oder sogar nurlscpu
.Das gibt dir alle MAC-Adressen für die Netzwerkschnittstellen, die vom Linux-Kernel erkannt werden, denke ich:
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 Sieip a help
Informationen darüber , wie dies zu tun.Beachten Sie auch, dass dieses Problem nicht
ip
nur bei Ihnen auftritt und behandelt werden mussifconfig
, sondern dass es zuverlässiger gehandhabt werden kannip
- was Teil deriproute2
Netzwerksuite ist und aktiv gewartet wird - als beiifconfig
Mitgliedern desnet-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 Erkennungudev
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:Suchen Sie
lsblk --help
nach Hinweisen zur Verfeinerung dieser Liste - beispielsweise nach Datenträgertyp. Überlegen Sie auchlspci
und / oderlsusb
vielleicht.Sie zu kombinieren ist einfach:
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:Dieser scheint jedoch ziemlich gut zu sein, aber ich werde die Ausgabe nicht veröffentlichen:
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: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 :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:
Der Linux-Kernel kann auch UUIDs für Sie generieren:
Oder:
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 mitefivarfs
geladenem Modul kann einen oder beide Namen so einfach wie folgt auflisten :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 .quelle
ip2
wurde speziell für das Parsen entwickelt, und es kann sein, dass ich es nicht gut genug mache - ich vermute, dass das Gleiche fast ohne gehtgrep/sed
. Wahrscheinlich könnte das auch so einfach mit gemacht werdenudevadm
. Und jeder EFI-Umgebungsvariablenname ist so konzipiert, dass er für genau diese Situationen eindeutig identifiziert werden kann.Viele moderne Distributionen liefern eine Datei
/etc/machine-id
mit einer höchstwahrscheinlich eindeutigen hexadezimalen Zeichenfolge mit 32 Zeichen. Es stammt von systemd, wo eine Hilfeseite mehr Informationen enthält , und ist möglicherweise für Ihren Zweck geeignet.quelle
dbus
meiner Meinung nach spezifisch ist und sich ändert, wenn ein Betriebssystem gelöscht / neu installiert wird.Auf vielen Linux-Rechnern
/var/lib/dbus/machine-id
enthält die Datei eine eindeutige ID für jede Linux-Distribution und kann durch einen Aufruf von aufgerufen werdendbus_get_local_machine_id()
. Dies ist wahrscheinlich das gleiche wie/etc/machine-id
oben erwähnt. Es funktioniert auch bei virtuellen Linux-Installationen. Ich habe es auf aktuellen Ubuntu-, SuSE- und CentOS-Distributionen überprüft.quelle
/etc/machine-id
.Benötigen Sie die Rechner-ID, um sich zu ändern, wenn sich die Hardware ändert? Wird die Rechner-ID verwendet, um etwas zu schützen? Ich glaube, die beste Möglichkeit, eine "konsistente" Rechner-ID zu erhalten, besteht darin, irgendwo im System eine zufällige Zeichenfolge zu speichern. Wenn sich die Hardware ändert, ändert sich auch die Rechner-ID nicht. Dies gilt auch für virtualisierte Systeme, bei denen der Hardwarezugriff eingeschränkt ist und die MAC-ID 00: 00: 00: 00 lautet
Versuchen Sie so etwas wie dieses sh-Skript, um die ID zu erstellen und zu erhalten:
quelle
/dev/urandom
Linux sowieso anzeigt, können Sie einfach tun,cat /proc/sys/kernel/random/uuid >$FILE
was bei jedem Lesevorgang zufällig eine korrekt formatierte UUID erzeugt. Dennoch kann jede auf der Festplatte implementierte Persistenzdbus
gelöscht werden. Vorausgesetzt , dies ist akzeptabel und wird installiert, sollten Sie wahrscheinlich das tun, was @XZS stattdessen vorgeschlagen hat.Die anderen Antworten geben eine Reihe von Möglichkeiten zum Extrahieren von IDs aus der Hardware. Sie können sich dafür entscheiden, eine oder mehrere Hardware-Komponenten als Bezeichner zu verwenden. Dies ist problematisch, wenn Sie Hardware-Teile beliebig austauschen oder ersetzen müssen.
Einige Leute können stattdessen eine generierte ID auf ihrer Festplatte speichern (oder die UUID verwenden), aber Festplatten können geklont werden.
TPM-Module und sicherer Start bieten möglicherweise die Möglichkeit, Motherboard und andere Hardware bei der Installation auf einer Festplatte zu binden.
In diesen Fällen ist es immer ein bisschen einfacher, wenn Sie weitere Informationen zu dem, was Sie erreichen möchten, angeben.
quelle