¿Cómo puedo encontrar el número de serie en una Mac mediante programación desde el terminal?

37

¿Qué comando puedo usar para recuperar el número de serie del sistema desde la línea de comandos de Unix? Como unamegenerará información sobre el software y el hardware, me gustaría recuperar el número de serie de un comando para usarlo en un script.

bmike
fuente

Respuestas:

55

El comando system_profiler proporciona una respuesta directa que es fácilmente legible por humanos (suponiendo que esté en 10.3 o más reciente), pero también puede usar ioreg para la tarea, ya que generalmente se completa más rápido.

system_profiler SPHardwareDataType es el tipo de datos que contiene la información central del hardware, y puede usar grep o awk para reducir aún más las cosas según sea necesario:

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

o

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

Ambos comandos tardan entre 0.5 y 0.2 segundos en ejecutarse en los modernos SSD Macs, por lo que si desea optimizar el comando y eliminar el " puede obtener su respuesta en 0.005s más o menos:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
bmike
fuente
2
El ioreguno es casi instantáneo en mi MBPR. system_profileraunque más rápido en este Mac que en los anteriores es mucho más lento.
markhunte
system_profile es muy lento, ioreg es súper rápido.
user1735921
14

Esto también funciona ...

ioreg -l | grep IOPlatformSerialNumber
MrPool
fuente
Ciertamente es más fácil escribir que la awkversión para eliminar las 600 líneas de ioregsalida que no queremos ver. (también, no se preocupe por los votantes negativos, a algunas personas realmente no les gustan las respuestas cortas u olvidan que no todos saben cómo funcionan grep y awk).
bmike
Ok, gracias bmike, me parece más simple, pero no esperaba votos negativos para una respuesta correcta. Bueno saber.
MrPool
1
@MrPool cuando repite lo que está en una respuesta anterior y no mejora en la respuesta anterior
user151019
1
No son votos equivocados per se. Incluso los votos negativos son buenos, ya que indican que alguien se preocupa lo suficiente como para tomar medidas. Además, trato de comentar o publicar en el chat cuando veo votos que no me parecen totalmente justos en suma. La buena noticia es que los votos positivos son +10 y los votos negativos solo -2, por lo que si publica algo controvertido (como este saldo cero con +2 y -2 sigue siendo +16 rep.) Bienvenido a Internet ;-)
bmike
1
Y la marca es correcta, si todo lo que un usuario hace es publicar exclusivamente cambios tardíos, breves y menores sin explicar (si supuse su punto, escribir grep es más claro, más corto y lo suficientemente bueno para muchos). ellos lo detienen. La mayoría de los usuarios de alta reputación comentarían mi respuesta, pero no podemos esperar que un nuevo usuario con 1 representante haga eso, ahora podemos :-)
bmike
2

Para que sea más fácil de recordar, utilice una búsqueda sin distinción entre mayúsculas y minúsculas:

ioreg -l | grep -i serialnumber | grep -i platform
Jared
fuente
Advertencia: esto devuelve una línea | "IOPlatformSerialNumber" = "YourSerialNumber" Está bien visualmente, pero si lo usa en un script, deberá canalizarlo a awk.
jasonology
1

Ejemplo 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;
}
usuario321228
fuente
Bienvenido a Ask Different. Por favor, comprenda que publicar una respuesta que esencialmente contiene solo código sin instrucciones sobre qué hacer con él o cómo usarlo no es una respuesta de calidad. Tómese el tiempo de leer ¿Cómo escribo una buena respuesta? y luego edite su respuesta para incluir instrucciones sobre cómo compilar el código y cómo usarlo. También toma el Tour .
user3439894
Vale la pena señalar que esto fue tomado de Apple Technical Docs, donde existe una explicación: developer.apple.com/library/archive/technotes/tn1103/…
Cinder Biscuits