Wie kann ich die Seriennummer auf einem Mac programmgesteuert vom Terminal aus finden?

37

Mit welchem ​​Befehl kann ich die Seriennummer des Systems von der Unix-Befehlszeile abrufen? Da unameeinige Informationen zu Software und Hardware ausgegeben werden, möchte ich die Seriennummer aus einem Befehl abrufen, der in einem Skript verwendet werden soll.

bmike
quelle

Antworten:

55

Der Befehl system_profiler bietet eine direkte Antwort, die für den Menschen leicht lesbar ist (vorausgesetzt, Sie verwenden Version 10.3 oder höher ). Sie können jedoch auch ioreg für die Aufgabe verwenden, da sie im Allgemeinen schneller ausgeführt wird.

system_profiler SPHardwareDataType ist der Datentyp, der die Kernhardwareinformationen enthält, und Sie können grep oder awk verwenden, um die Dinge nach Bedarf weiter zu reduzieren:

system_profiler SPHardwareDataType | awk '/Serial/ {print $4}'

oder

ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'

Die Ausführung dieser beiden Befehle auf modernen SSD-Macs dauert zwischen 0,5 und 0,2 Sekunden. Wenn Sie also den Befehl optimieren und die Option "entfernen" möchten, können Sie Ihre Antwort in etwa 0,005 Sekunden erhalten:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
bmike
quelle
2
Der ioregist fast sofort auf meinem MBPR. system_profilerObwohl auf diesem Mac schneller als auf meinen älteren, ist er viel langsamer.
Markhunte
system_profile ist so langsam, ioreg ist super schnell.
user1735921
14

Das funktioniert auch ...

ioreg -l | grep IOPlatformSerialNumber
MrPool
quelle
Es ist sicherlich einfacher zu tippen als die awkVersion, um die 600 Zeilen der ioregAusgabe herauszulösen, die wir nicht sehen wollen. (auch - macht euch nichts aus den down-
wählern
Ok, danke bmike, es scheint mir einfacher zu sein, aber ich habe nicht damit gerechnet, dass die Stimmen für eine richtige Antwort runtergehen. Gut zu wissen.
MrPool
1
@ MrPool, wenn es wiederholt, was in einer früheren Antwort ist und nicht besser als die vorherige
user151019
1
Sie sind per se keine falschen Stimmen. Sogar Abstimmungen nach unten sind gut, da sie anzeigen, dass sich jemand genug Sorgen macht, um Maßnahmen zu ergreifen. Außerdem versuche ich zu kommentieren oder im Chat zu posten, wenn ich Stimmen sehe, die mir in der Summe nicht ganz fair erscheinen. Die gute Nachricht ist, dass die oberen Stimmen nur +10 und die unteren Stimmen nur -2 sind. Wenn Sie also etwas Kontroverses posten (wie dieses Null-Gleichgewicht mit +2 und -2 ist immer noch +16 Rep.),
Sind Sie
1
Und die Markierung ist richtig, wenn ein Benutzer nur kurze, kurze Änderungen ohne Erklärung veröffentlicht (wenn ich davon ausgeht, dass die Eingabe von grep klarer, kürzer und für viele gut genug ist), kann ich diesen Benutzer anpingen und fragen sie klopfen es ab. Die meisten hoch angesehenen Benutzer würden meine Antwort kommentieren, aber wir können nicht erwarten, dass ein neuer Benutzer mit 1 Mitarbeiter dies tut. Jetzt können wir :-)
bmike
2

Verwenden Sie eine Suche, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird, um das Erinnern zu erleichtern:

ioreg -l | grep -i serialnumber | grep -i platform
Jared
quelle
Warnung: Dies gibt eine Zeile zurück "IOPlatformSerialNumber" = "YourSerialNumber" Optisch ist das in Ordnung, aber wenn Sie es in einem Skript verwenden, müssen Sie es an awk leiten.
Jasonology
1

C ++ Beispiel:

#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>

std::string 

getSerialNumber()

{

   CFStringRef serial;
    char buffer[32] = {0};
    std::string seriaNumber;

io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
                                                          IOServiceMatching("IOPlatformExpertDevice"));
if (platformExpert)
{
    CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,
                                                                       CFSTR(kIOPlatformSerialNumberKey),
                                                                       kCFAllocatorDefault, 0);
    if (serialNumberAsCFString) {
        serial = (CFStringRef)serialNumberAsCFString;
    }
    if (CFStringGetCString(serial, buffer, 32, kCFStringEncodingUTF8)) {
        seriaNumber = buffer;
    }

    IOObjectRelease(platformExpert);
}
return seriaNumber;
}
user321228
quelle
Willkommen bei Ask Different. Bitte haben Sie Verständnis dafür, dass das Posten einer Antwort, die im Wesentlichen nur Code ohne Anweisungen enthält, keine qualitative Antwort ergibt. Bitte nehmen Sie sich die Zeit zum Lesen Wie schreibe ich eine gute Antwort? Bearbeiten Sie anschließend Ihre Antwort, um Anweisungen zum Kompilieren des Codes und zu dessen Verwendung zu erhalten. Machen Sie auch die Tour .
user3439894
Es ist erwähnenswert, dass dies aus Apple Technical Docs stammt, wo es eine Erklärung gibt: developer.apple.com/library/archive/technotes/tn1103/…
Cinder Biscuits