Jak mogę znaleźć numer seryjny na komputerze Mac programowo z terminala?

37

Jakiego polecenia mogę użyć, aby pobrać numer seryjny systemu z wiersza poleceń unix? W związku unamez wyświetlaniem niektórych informacji o oprogramowaniu i sprzęcie, chciałbym pobrać numer seryjny z polecenia, które ma zostać użyte w skrypcie.

bmike
źródło

Odpowiedzi:

55

Polecenie system_profiler zapewnia bezpośrednią odpowiedź, która jest łatwa do odczytania przez człowieka (zakładając, że korzystasz z wersji 10.3 lub nowszej), ale możesz także użyć ioreg do zadania, ponieważ generalnie kończy się ono szybciej.

system_profiler SPHardwareDataType jest typem danych, który zawiera podstawowe informacje o sprzęcie, i możesz użyć grep lub awk, aby w razie potrzeby zmniejszyć liczbę elementów:

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

lub

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

Oba te polecenia działają od 0,5 do 0,2 sekundy na nowoczesnych komputerach Mac z dyskiem SSD, więc jeśli chcesz zoptymalizować polecenie i usunąć „ możesz uzyskać odpowiedź w około 0,005 s:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
bmike
źródło
2
Ten ioregjest prawie natychmiastowy na moim MBPR. system_profilerchociaż na tym Macu szybszy niż moje starsze jest znacznie wolniejszy.
markhunte
system_profile jest tak wolny, że ioreg jest super szybki.
user1735921,
14

Działa to również…

ioreg -l | grep IOPlatformSerialNumber
MrPool
źródło
Z pewnością łatwiej jest pisać niż awkwersję, aby usunąć 600 wierszy ioregwyjścia, których nie chcemy widzieć. (także - nie przejmuj się wyborcami - niektórzy naprawdę nie lubią krótkich odpowiedzi lub zapominają, że nie wszyscy wiedzą, jak działają grep i awk.)
bmike
Ok, dzięki bmike, wydaje mi się to prostsze, ale nie spodziewałem się głosów za prawidłową odpowiedzią. Dobrze wiedzieć.
MrPool
1
@MrPool, gdy powtórzy to, co jest w poprzedniej odpowiedzi i nie poprawi się w stosunku do poprzedniego
user151019
1
Nie są to złe głosy jako takie. Nawet niższe głosy są dobre, ponieważ wskazują, że ktoś dba o to, aby podjąć działanie. Ponadto staram się komentować lub publikować posty na czacie, gdy widzę głosy, które nie wydają mi się całkowicie uczciwe. Dobrą wiadomością jest to, że liczba głosów w górę wynosi +10, a głosów w dół tylko -2, więc jeśli opublikujesz coś kontrowersyjnego (np. Zero salda z +2 i -2 to nadal +16 powtórzeń) witamy w internecie ;-)
bmike
1
I ocena jest poprawna, jeśli wszystko, co robi użytkownik, to publikowanie wyłącznie z opóźnieniem, krótkich, drobnych zmian bez wyjaśnienia (jeśli zgadłem, o co ci chodzi - pisanie grep jest zarówno bardziej wyraźne, krótsze i wystarczająco dobre dla wielu), mogę pingować tego użytkownika i zapytać odrzucają to. Większość użytkowników o wysokiej reputacji skomentowałoby moją odpowiedź, ale nie możemy oczekiwać, że zrobi to nowy użytkownik z 1 powtórzeniem, teraz możemy :-)
bmike
2

Aby ułatwić zapamiętanie, użyj wyszukiwania bez rozróżniania wielkości liter:

ioreg -l | grep -i serialnumber | grep -i platform
Jared
źródło
Ostrzeżenie: zwraca linię | "IOPlatformSerialNumber" = "YourSerialNumber" Wygląda dobrze, ale jeśli użyjesz go w skrypcie, musisz go potokować, aby awk.
jasonology
1

Przykład 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;
}
użytkownik321228
źródło
Witamy w Zapytaj inaczej. Proszę zrozumieć, że opublikowanie odpowiedzi, która zasadniczo zawiera tylko kod, bez żadnych wskazówek, co z nim zrobić lub jak go używać, nie stanowi dobrej jakości odpowiedzi. Poświęć trochę czasu na przeczytanie Jak napisać dobrą odpowiedź? a następnie edytuj swoją odpowiedź, aby zawierała instrukcje dotyczące kompilowania kodu i sposobu jego użycia. Weź również wycieczkę .
user3439894
Warto zauważyć, że zostało to zaczerpnięte z Dokumentów Technicznych Apple, gdzie istnieje wyjaśnienie: developer.apple.com/library/archive/technotes/tn1103/...
Cinder Biscuits