Come posso trovare il numero seriale su un mac a livello di codice dal terminale?


37

Quale comando posso usare per recuperare il numero seriale del sistema dalla riga comandi unix? Come unameverranno fornite alcune informazioni sul software e sull'hardware, vorrei recuperare il numero seriale da un comando da utilizzare in uno script.

Risposte:


55

Il comando system_profiler fornisce una risposta diretta che è facilmente leggibile dall'uomo (supponendo che tu sia su 10.3 o più recente), ma puoi anche usare ioreg per l'attività poiché generalmente si completa più velocemente.

system_profiler SPHardwareDataType è il tipo di dati che contiene le informazioni hardware di base e puoi usare grep o awk per ridurre ulteriormente le cose se necessario:

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

o

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

Entrambi questi comandi richiedono tra 0,5 e 0,2 secondi per essere eseguiti sui moderni Mac SSD, quindi se si desidera ottimizzare il comando e rimuovere " è possibile avere la risposta in circa 0,005 secondi:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'

2
L' ioreguno è vicina istante sul mio MBPR. system_profileranche se più veloce su questo Mac rispetto ai miei più vecchi è molto più lento.
markhunte,

system_profile è così lento, ioreg è super veloce.
user1735921

14

Funziona anche ...

ioreg -l | grep IOPlatformSerialNumber

È certamente più facile da digitare rispetto alla awkversione rimuovere le 600 linee di ioregoutput che non vogliamo vedere. (inoltre - non preoccupatevi degli elettori negativi - ad alcune persone in realtà non piacciono le risposte brevi o dimenticano che non tutti sanno come funzionano grep e awk.)
bmike

Ok, grazie bmike, mi sembra più semplice, ma non mi aspettavo voti negativi per una risposta corretta. Buono a sapersi.
MrPool,

1
@MrPool quando ripete ciò che è in una risposta precedente e non migliora su quella precedente
user151019

1
Non sono voti sbagliati di per sé. Anche i voti negativi sono buoni in quanto indicano che qualcuno si preoccupa abbastanza per agire. Inoltre, provo a commentare o postare in chat quando vedo voti che non mi sembrano totalmente onesti in somma. La buona notizia è che i voti positivi sono +10 e i voti negativi solo -2, quindi se pubblichi qualcosa di controverso (come questo saldo zero con +2 e -2 è ancora +16 rep.) Benvenuto su Internet ;-)
bmike

1
E mark è corretto, se tutto ciò che un utente fa è pubblicare esclusivamente modifiche in ritardo, brevi e minori senza spiegare (se ho indovinato il tuo punto - digitare grep è sia più chiaro, più breve e abbastanza buono per molti) Potrei eseguire il ping di quell'utente e chiedere lo mettono fuori. Gli utenti più rinomati commenterebbero la mia risposta, ma non possiamo aspettarci che un nuovo utente con 1 rappresentante lo faccia, ora possiamo :-)
bmike

2

Per semplificare la memorizzazione, utilizzare una ricerca senza distinzione tra maiuscole e minuscole:

ioreg -l | grep -i serialnumber | grep -i platform

Attenzione: questo restituisce una riga | "IOPlatformSerialNumber" = "YourSerialNumber" Va bene visivamente ma se lo usi in uno script dovrai reindirizzarlo a awk.
jasonology il

1

Esempio C ++:

#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;
}

Benvenuti a chiedere diverso. Ti preghiamo di comprendere che pubblicare una risposta che essenzialmente contiene solo codice senza indicazioni su cosa fare con esso o su come utilizzarlo non fornisce una risposta di qualità. Si prega di prendere il tempo di leggere Come posso scrivere una buona risposta? e quindi modificare la risposta per includere le istruzioni sulla compilazione del codice e su come utilizzarlo. Fai anche il tour .
user3439894

Vale la pena notare che questo è stato preso da Apple Technical Docs, dove esiste una spiegazione: developer.apple.com/library/archive/technotes/tn1103/…
Cinder Biscuits
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.