Comment puis-je trouver le numéro de série sur un mac par programmation à partir du terminal?

37

Quelle commande puis-je utiliser pour extraire le numéro de série du système à partir de la ligne de commande unix? Comme unamecertaines informations sur le logiciel et le matériel seront affichées, je voudrais récupérer le numéro de série d’une commande à utiliser dans un script.

bmike
la source

Réponses:

55

La commande system_profiler fournit une réponse directe qui est facilement lisible par l'homme (en supposant que vous utilisez la version 10.3 ou une version plus récente), mais vous pouvez également utiliser ioreg pour la tâche, car elle se termine généralement plus rapidement.

system_profiler SPHardwareDataType est le type de données qui contient les informations de base sur le matériel. Vous pouvez utiliser grep ou awk pour réduire les éléments au besoin:

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

ou

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

L’exécution de ces deux commandes prend entre 0,5 et 0,2 seconde sur un Mac SSD moderne, donc si vous souhaitez optimiser la commande et supprimer le message « vous pouvez obtenir votre réponse en 0.005s ou plus:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
bmike
la source
2
Celui ioregest presque instantané sur mon MBPR. system_profilerbien que plus rapide sur ce mac que mes plus anciens est beaucoup plus lent.
markhunte
system_profile est si lent, ioreg est super rapide.
user1735921
14

Cela fonctionne aussi…

ioreg -l | grep IOPlatformSerialNumber
MrPool
la source
Il est certainement plus facile de taper que la awkversion de supprimer les 600 lignes de ioregsortie que nous ne voulons pas voir. (aussi - ne dérange pas les électeurs qui se
trouvent en
Ok, merci bmike, cela me semble plus simple, mais je ne m'attendais pas à un vote négatif pour une réponse correcte. Bon à savoir.
MrPool
1
@MrPool quand il répète ce qui est dans une réponse précédente et n'améliore pas la précédente
user151019
1
Ils ne sont pas faux votes en soi. Même les votes à la baisse sont bons car ils indiquent que quelqu'un se soucie suffisamment pour agir. De plus, j'essaie de commenter ou de poster pour discuter lorsque je vois des votes qui ne me semblent pas totalement justes en somme. Les bonnes nouvelles sont les votes positifs sont +10 et les votes négatifs seulement -2 donc si vous postez quelque chose de controversé (comme ce solde nul avec +2 et -2 est toujours +16 rep.) Bienvenue sur Internet ;-)
bmike
1
Et mark est correct, si tout ce que l’utilisateur écrit est exclusivement en retard, de brèves modifications mineures sans expliquer (si j’ai bien compris ce que vous dites - taper grep est à la fois plus clair, plus court et assez bon pour beaucoup). ils le coupent. La plupart des utilisateurs très réputés ont commenté ma réponse, mais nous ne pouvons pas nous attendre à ce qu'un nouvel utilisateur disposant d'un seul représentant le fasse, nous pouvons maintenant :-)
bmike
2

Pour faciliter la mémorisation, utilisez une recherche insensible à la casse:

ioreg -l | grep -i serialnumber | grep -i platform
Jared
la source
Attention: cela retourne une ligne | "IOPlatformSerialNumber" = "YourSerialNumber" C'est très bien visuellement, mais si vous l'utilisez dans un script, vous devrez le diriger vers awk.
jasonologie
1

Exemple 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;
}
utilisateur321228
la source
Bienvenue sur Ask Different. S'il vous plaît, comprenez que poster une réponse qui ne contient essentiellement que du code sans aucune indication sur ce qu'il faut en faire ou sur la façon de l'utiliser ne constitue pas une réponse de qualité. Veuillez prendre le temps de lire Comment puis-je écrire une bonne réponse? Modifiez ensuite votre réponse pour inclure des instructions sur la compilation du code et sur son utilisation. Prenez aussi le tour .
user3439894
Il est à noter que cela provient de Apple Technical Docs, où une explication existe: developer.apple.com/library/archive/technotes/tn1103/…
Cinder Biscuits