Como posso encontrar o número de série em um mac programaticamente a partir do terminal?

37

Que comando posso usar para recuperar o número de série do sistema na linha de comando unix? Como unameproduzirá algumas informações sobre o software e o hardware, gostaria de recuperar o número de série de um comando para usar em um script.

bmike
fonte

Respostas:

55

O comando system_profiler fornece uma resposta direta que é facilmente legível por humanos (supondo que você esteja na versão 10.3 ou mais recente), mas você também pode usar o ioreg para a tarefa, pois ela geralmente é concluída mais rapidamente.

system_profiler SPHardwareDataType é o tipo de dados que contém as informações principais de hardware e você pode usar grep ou awk para analisar as coisas ainda mais, conforme necessário:

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

ou

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

Esses dois comandos demoram entre 0,5 e 0,2 segundos para serem executados nos Macs SSD modernos; portanto, se você deseja otimizar o comando e remover o ", você pode ter sua resposta em 0,005s ou mais:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
bmike
fonte
2
A ioregum está perto instantânea no meu MBPR. system_profilerembora mais rápido neste mac do que os meus mais antigos seja muito mais lento.
markhunte
system_profile é tão lento, ioreg é super rápido.
user1735921
14

Isso também funciona…

ioreg -l | grep IOPlatformSerialNumber
MrPool
fonte
É certamente mais fácil digitar do que a awkversão remover as 600 linhas de ioregsaída que não queremos ver. (também - não me importo os eleitores para baixo - algumas pessoas realmente não gosto de respostas curtas ou esquecer que nem todos sabem como grep e trabalho awk.)
bmike
Ok, obrigado bmike, parece mais simples para mim, mas não esperava votos negativos para uma resposta correta. Bom saber.
MrPool
11
@MrPool quando o faz repetir o que está em uma resposta mais cedo e não melhoram com o anterior
user151019
11
Eles não são votos errados por si só. Mesmo votos negativos são bons, pois indicam que alguém se importa o suficiente para agir. Além disso, tento comentar ou postar no chat quando vejo votos que não me parecem totalmente justos. As boas notícias são os votos em alta são +10 e os votos em baixa apenas -2, portanto, se você postar algo polêmico (como esse saldo zero com +2 e -2 ainda é +16 repetições), seja bem-vindo à internet ;-)
bmike
11
E mark está correto, se tudo o que um usuário faz é postar exclusivamente tarde, pequenas, pequenas mudanças sem explicar (se eu adivinhei seu ponto, digitar grep é mais claro, mais curto e bom o suficiente para muitos). eles pararam com isso. A maioria dos usuários de grande reputação iria comentar sobre a minha resposta, mas não podemos esperar que um novo usuário com um representante para fazer isso, agora podemos :-)
bmike
2

Para facilitar a lembrança, use uma pesquisa que não diferencia maiúsculas de minúsculas:

ioreg -l | grep -i serialnumber | grep -i platform
Jared
fonte
Atenção: isso retorna uma linha | "IOPlatformSerialNumber" = "YourSerialNumber" Tudo bem visualmente, mas se você o usar em um script, será necessário canalizá-lo para despertar.
jasonology 25/06
1

Exemplo de 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
fonte
Bem-vindo ao perguntar diferente. Por favor, entenda que a publicação de uma resposta que contenha essencialmente apenas um código sem instruções sobre o que fazer com ele ou como usá-lo não resulta em uma resposta de qualidade. Por favor, dedique um tempo para ler Como redigir uma boa resposta? e edite sua resposta para incluir instruções sobre a compilação do código e como usá-lo. Também faça o tour .
user3439894 14/02
Vale ressaltar que isso foi retirado do Apple Technical Docs, onde existe uma explicação: developer.apple.com/library/archive/technotes/tn1103/…
Biscoitos de Cinder