Как программно найти серийный номер на Mac с терминала?

37

Какую команду я могу использовать для получения серийного номера системы из командной строки Unix? Поскольку unameбудет выводиться некоторая информация о программном и аппаратном обеспечении, я хотел бы получить серийный номер из команды для использования в сценарии.

bmike
источник

Ответы:

55

Команда system_profiler предоставляет прямой ответ, который легко читается человеком (при условии, что у вас версия 10.3 или новее), но вы также можете использовать ioreg для выполнения задачи, поскольку обычно она выполняется быстрее.

system_profiler SPHardwareDataType это тип данных, который содержит информацию об оборудовании ядра, и вы можете использовать grep или awk, чтобы при необходимости урезать данные:

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

или

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

Обе эти команды работают от 0,5 до 0,2 секунд на современных SSD Mac, поэтому, если вы хотите оптимизировать команду и убрать « вы можете получить свой ответ через 0,005 с или около того:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
bmike
источник
2
ioregОдин рядом момент на моем MBPR. system_profilerхотя быстрее на этом Mac, чем мои старые гораздо медленнее.
markhunte
system_profile такой медленный, ioreg супер быстрый.
user1735921
14

Это также работает ...

ioreg -l | grep IOPlatformSerialNumber
MrPool
источник
Конечно, легче набрать текст, чем awkлишить 600 строк ioregвывода, которые мы не хотим видеть. (также - не обращайте внимания на опущенных избирателей - некоторые люди действительно не любят короткие ответы или забывают, что не все знают, как работают grep и awk.)
bmike
Хорошо, спасибо bmike, мне кажется, что это проще, но я не ожидал, что за правильный ответ понизятся голоса. Хорошо знать.
MrPool
1
@MrPool, когда он повторяет то, что есть в предыдущем ответе и не улучшается по сравнению с предыдущим
user151019
1
Они не неправильные голоса как таковые. Даже отрицательные голоса хороши, поскольку они указывают, что кто-то заботится достаточно, чтобы принять меры. Кроме того, я пытаюсь комментировать или публиковать сообщения в чате, когда вижу голоса, которые не кажутся мне абсолютно справедливыми по сумме. Хорошей новостью является то, что число голосов «за» +10, а число голосов «за» -2, так что если вы публикуете что-то противоречивое (например, этот нулевой баланс с +2 и -2 по-прежнему +16 представителей), добро пожаловать в Интернет ;-)
bmike
1
И отметка верна, если все, что пользователь делает, это публикует исключительно поздние, короткие, незначительные изменения без объяснения (если я угадаю вашу точку зрения - ввод grep более понятен, короче и достаточно хорош для многих), я мог бы пропинговать этого пользователя и спрашивать они сбивают это. Большинство пользователей с высокой репутацией прокомментируют мой ответ, но мы не можем ожидать, что новый пользователь с 1 повторением сделает это, теперь мы можем :-)
bmike
2

Чтобы было легче запомнить, используйте поиск без учета регистра:

ioreg -l | grep -i serialnumber | grep -i platform
Джаред
источник
Предупреждение: это возвращает строку | "IOPlatformSerialNumber" = "YourSerialNumber" Это нормально визуально, но если вы используете его в скрипте, вам нужно будет передать его в awk.
Джейсонология
1

Пример 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;
}
user321228
источник
Добро пожаловать, чтобы спросить другого. Пожалуйста, поймите, что публикация ответа, который по существу содержит только код без каких-либо указаний относительно того, что с ним делать или как его использовать, не дает качественного ответа. Пожалуйста, найдите время, чтобы прочитать. Как мне написать хороший ответ? а затем отредактируйте свой ответ, включив в него инструкцию по компиляции кода и его использованию. Также возьмите Тур .
user3439894
Стоит отметить, что это было взято из Технических документов Apple, где есть объяснение: developer.apple.com/library/archive/technotes/tn1103/…
Печенье Cinder