L'année de modèle d'un Mac peut-elle être déterminée avec une commande de terminal?

58

Est-ce que quelqu'un connaît une commande de terminal qui me donne le modèle de mon Mac?

Par exemple, «MacBook Pro, Retina, 13 pouces, mi-2013» ou «MacBook Pro, fin 2009» ou «Mac Mini, début 2010».

Ces informations n'existent pas dans SystemProfiler ( /usr/sbin/system_profiler SPHardwareDataType), mais sous OS X 10.7 et OS X 10.8, vous pouvez voir ces informations lorsque vous cliquez sur "Plus d'infos ..." dans la fenêtre "À propos de ce Mac".

Mac
la source
1
Je ne pense pas qu'il existe une commande permettant d'identifier un Mac directement "fin 2009". Cependant, il peut être dérivé de l'identifiant de modèle. Voir ma réponse pour une explication. Que veux-tu dire par la But in OS X 10.7 and 10.8...phrase? Lorsque je regarde dans la fenêtre À propos de ce Mac, je ne vois rien qui indique Late 2009 ou quelque chose de similaire.
Saaru Lindestøkke
2
@BartArondson - sur 10.8 l'écran de À propos de ce Mac montre Mac Mini sur une ligne, puis fin 2012 sur la suivante
user151019
Ah je le vois maintenant. C'est quand vous cliquez sur About This Macpuis sur More Info.... Je ne sais pas comment obtenir cette information dans votre terminal.
Saaru Lindestøkke

Réponses:

69

Vous pouvez obtenir indirectement ces informations à partir d’une page Web et de la commande curl. Dans le passé, cette URL a été supprimée, son taux est limité et une sorte de captcha a été mis en place pour empêcher cette utilisation. Vous devrez donc peut-être recourir à d’autres voies telles que https://checkcoverage.apple.com/ .

Selon que votre numéro de série comporte 11 ou 12 caractères, prenez les 3 ou 4 derniers caractères, respectivement, et transmettez-les à l'URL suivante après la partie ? Cc = XXXX . Si votre numéro de série était composé de 12 caractères et s’était terminé par DJWR, vous devez émettre cette commande:

curl https://support-sp.apple.com/sp/product?cc=DJWR

Pour obtenir votre numéro de série, utilisez la commande suivante:

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

Ainsi, vous pourriez avoir une commande compliquée pour interroger Internet si vous avez besoin d'une seule commande:

curl https://support-sp.apple.com/sp/product?cc=$(
  system_profiler SPHardwareDataType \
    | awk '/Serial/ {print $4}' \
    | cut -c 9-
)

puis exécutez la sortie de cela à travers sed pour couper à la partie clé

curl -s https://support-sp.apple.com/sp/product?cc=$(
  system_profiler SPHardwareDataType \
    | awk '/Serial/ {print $4}' \
    | cut -c 9-
) | sed 's|.*<configCode>\(.*\)</configCode>.*|\1|'

Il existait un fichier de bibliothèque privée avec ces mappages pour pouvoir le consulter hors ligne, mais j’ai remarqué qu’il n’était plus disponible à partir de 10.8.3 (et peut-être plus tôt), l’astuce ci-dessus est donc la seule que je connaisse qui fonctionne avec le système d’exploitation actuel sans bibliothèques tierces.

Quelques belles librairies tierces fournissent un aperçu de ceci:

Notez que depuis novembre 2017, Apple a forcé l'utilisation de httpsover httppour ce service.

bmike
la source
Encore une question. Si je mets la dernière option que vous m'avez donnée dans le terminal, je reçois ceci: <? Xml version = "1.0" encoding = "utf-8"?> <Racine> <nom> Nom de la CPU </ name> <codeConf> iMac (27 -inch, fin 2009) </ configCode> <locale> en_US </ locale> </ root> ". Est-il possible d'obtenir juste" (27 pouces, fin 2009) "? Tanks: P
Mac
Ainsi, l'écran Plus d'infos (celui mentionné par le PO) tire-t-il ses informations d'une base de données en ligne? Le nom marketing n'est-il pas stocké localement quelque part s'il y est affiché?
Saaru Lindestøkke
Je pense que c'est sur une base de données. Mais dans mon cas, ce n’est pas un problème: P Mais si je peux l’obtenir sans Internet, ce serait formidable, bien sûr. Mais si je peux seulement obtenir le texte "(27 pouces, fin 2009)", ce serait formidable! Cordialement
Mac
Je suppose que le système le met en cache lors de l'enregistrement ou qu'il existe un SDK interne privé pour obtenir les informations. Auparavant, il faisait partie du framework privé ServerKit - il est donc clairement non documenté et a déjà changé. Je sais que Mac peut afficher les informations sans connexion Internet - mais je ne sais pas vraiment si elles sont mises en cache ou déterminées au moment de l'installation et si elles sont codées en dur.
bmike
2
Semblable à utiliser sysctl -n hw.modelmentionné ci-dessous, ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'travaillera plus rapidement pour obtenir le numéro de série.
n8felton
37

Vous pouvez utiliser la commande

system_profiler SPHardwareDataType | grep "Model Identifier"

dans Terminal pour obtenir l’ID de modèle de votre machine.
Vous pouvez ensuite entrer cet identifiant sur ce site, qui indiquera le mois et l'année de lancement du modèle.

Comme mentionné dans les commentaires ci-dessous, la commande suivante est beaucoup plus rapide:

sysctl hw.model
Saaru Lindestøkke
la source
4
system_profiler SPHardwareDataType | grep "Model Identifier"s'exécute beaucoup plus rapidement que le profileur complet, mais ne renvoie toujours pas le nom marketing tel que demandé par l'OP. Voir ma réponse pour une commande qui fonctionne autour de la partie "recherche" de votre réponse d'une manière conviviale pour les terminaux.
bmike
1
Votre réponse serait parfaite pour apple.stackexchange.com/questions/40243/… cependant ;-)
bmike
4
Pour la même sortie, sysctl hw.modelest plus rapide que la commande ci-dessus.
Liyali
7

Sur El Capitan et Sierra, il existe un fichier plist dans un framework privé avec un dict of info pour chaque identifiant de modèle; ce dict comprend le nom marketing (qui contient l'année modèle). Je ne sais pas quelle version du système d’exploitation ce fichier est arrivé, mais ce n’est PAS sur Snow Leopard (la seule chose que j’ai est plus ancienne que El Capitan).

#! /bin/ksh
if [ -f /System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist ]
then
    marketingModel="$(modelid="$(system_profiler SPHardwareDataType 2>/dev/null|awk '/Model Identifier:/ {print $NF}')"
    defaults read /System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist "MacBookPro12,1"|sed -n -e 's/\\//g' -e 's/.*marketingModel = "\(.*\)";/\1/p')"
    echo "${marketingModel}"
else
    echo "can't use offline method to find marketing name on this OS version"
fi

Donc, vous pouvez utiliser cela (ou d'autres astuces similaires pour d'autres versions de système d'exploitation après avoir vérifié la version du système d'exploitation, si vous connaissez ces astuces, ce que je ne connais pas), et si cela ne s'appliquait pas, vous pouvez toujours revenir à l'approche. cela nécessite un accès Internet.

Ce n’est pas exactement la même chose que ce que nous montre About This Mac, qui dans mon cas est
MacBook Pro (Retina, 13 pouces, début 2015),
alors que cela montre un
MacBook Pro 13 pouces avec écran Retina (début 2015),
mais en termes lisibles par l’homme. , Je pense que c'est assez proche.

Richard Hamilton
la source
Je me rends compte que cette réponse date de plus de 2 ans, mais elle porte l'identifiant de modèle hardcoded (ligne 4 MacBookPro12,1), ce qui signifie qu'il prétend toujours que vous êtes sur un début de mpb 13 ".
egid
Une autre façon:/usr/libexec/PlistBuddy -c "print :$(sysctl hw.model | cut -f 2 -d ' '):_LOCALIZABLE_:marketingModel" /System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist
gregmac
4

En retard au jeu, mais voici une approche:

hardware_model () {

  local hardware_mod=$(defaults read 
  ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' \
  |cut -sd '"' -f 4 \
  |uniq)
}

.

Cette fonction lit un fichier plist, cherche CPU Namesdans ce fichier:

{
    "CPU Names" =     {
        "J1GN-en-US_US" = "iMac (Retina 5K, 27-inch, 2017)";
    };
} 

, puis l’utilisation du délimiteur "analyse le quatrième champ:

iMac (Retina 5K, 27-inch, 2017) 

Testé pour fonctionner sur les versions actuellement prises en charge de OS X.

marshki
la source
C'est l'approche la plus simple qui a réellement fonctionné pour moi sur Catalina. Les autres réponses avec plus de votes nécessitent un accès Internet ou renvoient l'identifiant de modèle, ce qui est trompeur. Par exemple, "MacBookPro15,1" correspond aux MBP 2018 et 2019. Je simplifierais encore plus, juste avec: defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' | cut -sd '"' -f 4 | uniq
Kamal
3

Voici un one-liner utilisant PlistBuddy, sans grep, sed ou awk-wardness.

/usr/libexec/PlistBuddy -c "print :$(sysctl -n hw.model):_LOCALIZABLE_:marketingModel" /System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist

cela retourne quelque chose comme:

15" MacBook Pro with Thunderbolt 3 and Touch ID (Mid 2017)

-

Une autre doublure qui produit une chaîne légèrement différente, utilisant également PlistBuddy (avec un tout petit peu de awk):

/usr/libexec/PlistBuddy -c "print :'CPU Names':$(system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 9-)-en-US_US" ~/Library/Preferences/com.apple.SystemProfiler.plist

MacBook Pro (15-inch, 2017)

Crédit à plusieurs des réponses ci-dessus pour cela.

broyer
la source
1

En combinant la réponse de Saaru avec une version mise au point de Richard Hamilton , je reçois le texte suivant, qui fonctionne de 10,6 à 10,12 (bien que la taille de l’échantillon sur 10.6 ne soit qu’une machine) et éventuellement antérieure / ultérieure, et ne dépende pas d’une connexion à Internet et les serveurs d'Apple ne changent pas

ATTRIBSFILE=/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes
if ! [ -f "${ATTRIBSFILE}.plist" ] ; then
  # 10.7 or 10.6
  ATTRIBSFILE=/System/Library/PrivateFrameworks/ServerKit.framework/Versions/A/Resources/English.lproj/XSMachineAttributes
fi
if [ -f "${ATTRIBSFILE}.plist" ]
then
    modelid="$(sysctl -n hw.model)"
    marketingModel="$(defaults read "${ATTRIBSFILE}" "${modelid}" |sed -n -e 's/\\//g' -e 's/.*marketingModel = "\(.*\)";/\1/p')"
    echo "${marketingModel}"
else
    echo "can't use offline method to find marketing name on this OS version"
fi

Quelques notes sur ce que j'ai découvert pour arriver ici:

  • Nous devons supprimer ".plist" du domaine pour defaultspouvoir fonctionner en 10.6, et donc l'ajouter à nouveau manuellement aux -ftests du shell
  • le -ndrapeau à sysctlsignifie qu'il n'imprime que la valeur, ce qui nous en épargne un peu sedou awkfonctionne
Piersg
la source
0

Nous avons quelques 2019 MBP qui renvoient des modèles d' année différents pour les deux one-liners publiés par tabrindle .

Son premier one-liner (using sysctl -n hw.model) revient en 2018 pour un modèle 2019:

Mauvais: MacBook Pro 15 "avec Thunderbolt 3 et Touch ID (mi-2018)

Mais son deuxième one-liner (using system_profiler SPHardwareDataType) renvoie le nom correct:

Droite: MacBook Pro (15 pouces, 2019)

Steven Klein
la source
-7

Cela devrait le faire:

system_profiler | more
sw_vers
scutil --get ComputerName
sw_vers | awk -F':\t' '{print $2}' | paste -d ' ' - - -
sysctl -n hw.memsize | awk '{print $0/1073741824" GB RAM"}'
sysctl -n machdep.cpu.brand_string
JoeriBe
la source
3
Aucune des commandes que vous avez énumérées ne répond à la demande de l'interrogateur.
Saaru Lindestøkke