it-swarm.com.de

Abrufen einer eindeutigen ID von einem Unix-ähnlichen System

Ich möchte von jedem Unix-ähnlichen System eine eindeutige ID erhalten (sofern dies möglich ist), die jedes Mal persistent ist, wenn meine Anwendung auf demselben Computer ausgeführt wird. Wenn es möglich ist, möchte ich die gleiche ID von Linux oder FreeBSD oder Solaris usw. erhalten. Ich möchte nicht für jede Maschine eine neue ID generieren, sondern eine bereits vorhandene, und ich bevorzuge diese ID kommen aus dem Betriebssystem und ich bevorzuge nicht, etwas wie die MAC-Adresse zu verwenden.

Wenn keine andere Option verfügbar ist, kann ich MAC in Kombination mit etwas anderem verwenden. Beispielsweise kann die ID der md5-Hash der Kombination aus der MAC-Adresse und etwas anderem sein.

Ich würde gerne auf Ihre Vorschläge hören.

Wenn es nützlich ist, ist meine Anwendung in C/C++ geschrieben.

Damit soll verhindert werden, dass ein Benutzer meine Anwendung zweimal oder öfter ausführt. Ich möchte nur einmal laufen.

22
Blue

Wie wäre es mit der UUID des Root-Dateisystems? Sie können das Root-Dateisystemgerät von /etc/fstab abrufen, indem Sie die Datei manuell analysieren oder getfsent (3) oder getfsfile (3) verwenden. Sobald Sie das Gerät haben, können Sie die UUID abrufen, indem Sie entweder die Links in /dev/disk/by-uuid oder über den Befehl blkid überprüfen.

28
Jason Day

Sowohl Solaris als auch Linux bieten das Dienstprogramm hostid (1)

11

Der beste Weg ist, wie immer zu sehen, wie andere Leute das gleiche Problem bereits gelöst haben.

FLEXlm verwendet auch eine Host-ID für die knotengesperrten Lizenzen. Die am häufigsten verwendete Host-ID ist die Ethernet-MAC-Adresse für eine Ihrer Netzwerkschnittstellen, die ohne Trennzeichen zusammengefasst ist.

Es kann auch (unter Windows) die Datenträgerseriennummer des Laufwerks C: (wieder ohne Trennzeichen zusammengefasst) und unter Solaris die Ausgabe des Befehls hostid (IIRC) verwenden. Diese Nummer ist tatsächlich eindeutig und befindet sich auf Sun-Computern auf einem kleinen entfernbaren EEPROM auf der Systemplatine).

Während die MAC - Adresse extrem einfach zu fälschen ist, ist sie heutzutage eine nahezu universelle Kennung (fast alle neuen Computer verfügen über mindestens einen Ethernet - Port, und es kommt sehr häufig vor, dass sie an Bord sind) und soll tatsächlich global eindeutig sein (in Tatsächlich hängen die Ethernet-Protokolle von dieser Einzigartigkeit ab. Die Hauptprobleme, die Sie mit diesem Ansatz haben würden:

  • Einige Computer haben mehrere Ethernet-Adressen. Einige befinden sich auf der Hauptplatine, andere auf separaten Wechselkarten.
  • Sie sind extrem einfach zu fälschen (und einige Protokolle hängen davon ab, dass sie geändert werden können).
  • Einige virtualisierte Umgebungen generieren bei jedem Start zufällige Ethernet-Adressen (aber sie haben normalerweise die Möglichkeit, einen festen Wert zu erzwingen).
9
CesarB

Eine andere Möglichkeit ist die Verwendung von Informationen, die von dmidecode abgeleitet sind, einem unter Linux vorhandenen Befehl. Diese Informationen werden aus/dev/mem dekodiert und erfordern daher Root-Zugriff.

Es ist bekannt, dass die gelesenen Informationen fehlerhaft sind, da einige Motherboard-Hersteller einige der Felder lügen oder fälschen.

5
Phillip Whelan

Es gibt keinen allgemeinen und zuverlässigen Weg, um das zu bekommen, was Sie wollen.

3
user3850

Ich denke nicht, dass es möglich ist. Das Beste, was Sie bekommen können, ist, eine sehr lange zufällige Zeichenfolge zu erstellen (wie es MS mit GUIDs macht) und sie irgendwo auf Ihrem System zu speichern.

3
Yoni Roit

Sie müssen berücksichtigen, dass viele Setups möglicherweise ein Dateisystem-Image erstellt und auf viele Computer geklont haben, anstatt sie einzeln einzurichten. In anderen Fällen könnte eine Maschine viele Male neu eingerichtet werden. Mit anderen Worten, alles, was vom Betriebssystem bereitgestellt wird, kann nicht als vertrauenswürdig eingestuft werden.

Die CPU verfügt zwar über eine eindeutige Seriennummer, der Zugriff darauf sollte jedoch auf verschiedenen Systemen unterschiedlich sein.

1
ironfroggy

Sie erwähnen nicht, wie stabil die eindeutige Kennung sein muss - möchten Sie, dass immer derselbe Host bei jeder Codeausführung dieselbe ID erzeugt?

Wenn nein, dann ist Fuzzymonks Vorschlag von uuidgen genau das, was Sie wollen.

Wenn ja, müssen Sie entscheiden, was für den Host "gleich" ist. Eine Möglichkeit wäre, wie Sie vermuten, die MD5-Summe des MAC der ersten Ethernet-Schnittstelle und "etwas". Für "etwas" in diesem Fall würde ich den vollqualifizierten Domänennamen in Betracht ziehen, es sei denn, Ihr Begriff "gleicher Host" beinhaltet die Änderung des vollqualifizierten Domänennamens ...

1
genehack

Sie können die UUID des Root-Dateisystems / abrufen, die ziemlich zuverlässig ist, aber nicht zwischen chroots und möglicherweise vms unterscheidet, die auf derselben Festplatte ausgeführt werden.

Wenn Sie hauptsächlich mit internen oder statischen Festplatten arbeiten, die für die Ausführung eines bestimmten Betriebssystems vorgesehen sind, sollten Sie in der Lage sein, die UUID des Root-Dateisystems zu verwenden, um das System zu erkennen.

Sie können die UUID der Root-Fs folgendermaßen abrufen: alias sys_guid='Sudo /sbin/blkid | grep "$(df -h / | sed -n 2p | cut -d" " -f1):" | grep -o "UUID=\"[^\"]*\" " | sed "s/UUID=\"//;s/\"//"'

Wenn Sie zwischen Kernel-Versionen desselben Betriebssystems oder verschiedenen Betriebssystemen, die auf derselben Festplatte ausgeführt werden, unterscheiden müssen, können Sie Daten aus uname verwenden und/oder diese mit der Root-UUID fs kombinieren.

1
user4401178

Klingt so, als würden Sie nach UUID suchen. Dies ist eine allgemeine, universell eindeutige ID (tatsächlich dasselbe wie eine GUID).

Es gibt viele C++ - Implementierungen in verschiedenen Bibliotheken, oder Sie können den Befehl uuidgen verwenden und die Ausgabe erfassen.

0
csexton

Die meisten Unix-ähnlichen Maschinen verfügen über einen Zufallszahlengenerator, auf den über /dev/random zugegriffen werden kann. Sie benötigen so etwas wie eine MAC-Adresse und eine Zeit, um dem Generator GUID eine echte Eindeutigkeit zu verleihen (dies ist die Aufgabe des Generators GUID unter Windows). Wenn Sie außerdem etwas von/dev/random abrufen, erhalten Sie ein einigermaßen gutes Konstrukt vom Typ GUID. In der Praxis machen die UUID-Bibliotheken so etwas hinter den Kulissen.

Wenn Sie nur eine Nummer pro Maschine benötigen, reicht wahrscheinlich eine MAC-Adresse aus. Diese werden von einer zentralen Stelle verwaltet, und man kann davon ausgehen, dass keine zwei MAC-Adressen gleich sind. Wenn Sie jedoch versuchen, eine Softwareinstallation mit einer MAC-Adresse zu verknüpfen, beachten Sie, dass einige Komponenten programmierbare MAC-Adressen oder programmierbare Komponenten der MAC-Adresse aufweisen. Unix-ähnliche Betriebssysteme, insbesondere Open-Source-Betriebssysteme, haben in der Regel keine fest verdrahteten Seriennummern. Dieser Ansatz kann auch Probleme beim Ausführen mehrerer Instanzen der Software in VMs verursachen.

Eine Option könnte ein USB Dongle sein, der von mehreren Herstellern bezogen werden kann. Eine andere Option kann ein Lizenzserver sein, bei dem der eindeutige Code dem Server zur Verfügung gestellt wird. Auch hierfür stehen verschiedene Lösungen aus unterschiedlichen Quellen zur Verfügung.

Sie haben erwähnt, dass Sie unter Windows eine GUID verwenden ... Haben Sie einige Details darüber, wie diese erstellt wird?

Abgesehen davon könnten Sie etwas wie CPU-ID oder Festplatten-ID ausprobieren ... Ich nehme an, diese können nicht geändert werden (aber Sie werden Probleme bekommen, wenn eine fehlerhafte Festplatte ersetzt wird).

0
oliver

Die Antworten von Jason Day und A.Danischewski scheinen auf dem richtigen Weg zu sein, erfüllen jedoch nicht die Kriterien eines "Unix-ähnlichen Systems", da /sbin/blkid und /etc/fstab unter OSX nicht vorhanden sind.

Der einzige zu 100% tragbare Ansatz wäre, einen Standardspeicherort für eine Datei zu wählen, die von Ihrer eigenen Anwendung erstellt wird, z. /etc/YOURAPP.cfg und speichere dort eine UUID, falls noch keine existiert.

Dies ist alles andere als ideal, da eine andere Person oder Anwendung die Datei löschen oder ändern oder wenn der Benutzer das Root-Dateisystem ändert, kann die ID auf dem aktuellen Computer verloren gehen oder auf einem anderen Computer erstellt werden. Ganz zu schweigen von Problemen mit Lese- und Schreibrechten und so weiter.

Aber am Ende gibt es keine "gleiche Maschine". Jeder Computer ist nicht mehr und nicht weniger als seine Komponenten + aktuelle Konfiguration. Ich glaube nicht, dass Sie es besser machen können, tragbar.

0
Chris Johnson