Kann das Modelljahr eines Mac mit einem Terminalbefehl ermittelt werden?

58

Kennt jemand einen Terminalbefehl, der mir das Modell meines Mac gibt?

Zum Beispiel - "MacBook Pro, Retina, 13-Zoll, Mitte 2013" oder "MacBook Pro, Ende 2009" oder "Mac Mini, Anfang 2010".

Diese Informationen sind im SystemProfiler ( /usr/sbin/system_profiler SPHardwareDataType) nicht vorhanden , aber in OS X 10.7 und OS X 10.8 können Sie diese Informationen sehen, wenn Sie im Fenster "About This Mac" auf "More Info ..." klicken.

Mac
quelle
1
Ich glaube nicht, dass es einen Befehl gibt, um einen Mac direkt als "Ende 2009" zu identifizieren. Es kann jedoch aus dem Modellidentifikator abgeleitet werden, siehe meine Antwort für eine Erklärung. Was meinst du mit dem But in OS X 10.7 and 10.8...Satz? Wenn ich in das Fenster "Über diesen Mac" schaue, sehe ich nichts, was Ende 2009 oder ähnliches aussagt.
Saaru Lindestøkke
2
@BartArondson - auf dem Bildschirm für About this Mac wird Mac Mini in einer Zeile und dann Ende 2012 in der nächsten
Zeile angezeigt
Ah, ich sehe es jetzt. Es ist, wenn Sie auf About This Macund dann auf klicken More Info.... Ich habe keine Ahnung, wie ich diese Informationen in Ihr Terminal bekommen kann.
Saaru Lindestøkke

Antworten:

69

Sie können diese Informationen indirekt über eine Webseite und den Befehl curl abrufen. In der Vergangenheit wurde diese URL heruntergenommen und auf bestimmte Raten begrenzt und hinter eine Art Captcha gestellt, um diese Verwendung zu verhindern. In diesem Fall müssen Sie möglicherweise auf andere Wege wie https://checkcoverage.apple.com/ zurückgreifen .

Je nachdem, ob Ihre Seriennummer 11 oder 12 Zeichen lang ist, nehmen Sie die letzten 3 bzw. 4 Zeichen und geben Sie diese nach dem Teil ? Cc = XXXX an die folgende URL weiter . Wenn Ihre Seriennummer aus 12 Zeichen besteht und mit DJWR endet, geben Sie den folgenden Befehl aus:

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

Verwenden Sie den folgenden Befehl, um Ihre Seriennummer abzurufen:

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

Sie könnten also einen komplizierten Befehl zum Abfragen des Internets haben, wenn Sie einen einzelnen Befehl benötigen:

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

und dann die Ausgabe davon durch sed laufen lassen, um zum Schlüsselteil zu schneiden

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|'

Früher gab es eine private Bibliotheksdatei mit diesen Zuordnungen, so dass Sie sie offline abrufen konnten, aber ich habe festgestellt, dass sie seit 10.8.3 (und möglicherweise früher) nicht mehr vorhanden ist. Daher ist der oben genannte Trick der einzige, den ich kenne und der auf dem aktuellen Betriebssystem funktioniert ohne Bibliotheken von Drittanbietern.

Einige nette Bibliotheken von Drittanbietern bieten einen Blick darauf:

Beachten Sie, dass Apple ab November 2017 die Verwendung von httpsover httpfür diesen Dienst erzwungen hat .

bmike
quelle
Noch eine Frage. Wenn ich die letzte Option, die Sie mir gegeben haben, in das Terminal stecke, erhalte ich Folgendes: <? Xml version = "1.0" encoding = "utf-8"?> <Root> <name> CPU-Name </ name> <configCode> iMac (27 -inch, Ende 2009) </ configCode> <locale> de_DE </ locale> </ root> ". Kann man nur" (27 Zoll, Ende 2009) "erhalten? Panzer: P
Mac
Ruft der Bildschirm "Weitere Informationen" (der im OP erwähnte Bildschirm) seine Informationen aus einer Online-Datenbank ab? Wird der Marketingname nicht lokal gespeichert, wenn er dort angezeigt wird?
SAARU Lindestøkke
Ich denke, es ist in einer Datenbank. Aber in meinem Fall ist es kein Problem: P Aber wenn ich es ohne Internet bekommen kann, wäre es natürlich großartig. Aber wenn ich nur den Text "(27 Zoll, Ende 2009)" bekommen könnte, wäre das großartig! Grüße
Mac
Ich vermute, dass das System es während der Registrierung zwischenspeichert oder es ein privates internes SDK gibt, um die Informationen abzurufen. Es befand sich früher im privaten Framework ServerKit - es ist also eindeutig undokumentiert und hat sich bereits geändert. Ich weiß, dass Mac die Informationen ohne Internetverbindung anzeigen kann - aber ich weiß nicht wirklich, ob sie zum Zeitpunkt der Installation zwischengespeichert oder bestimmt und fest codiert sind.
bmike
2
Ähnlich wie bei der Verwendung von sysctl -n hw.modelunten beschrieben, ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'funktioniert das Abrufen der Seriennummer schneller.
n8felton
37

Sie können den Befehl verwenden

system_profiler SPHardwareDataType | grep "Model Identifier"

im Terminal, um die Modell-ID Ihres Computers abzurufen.
Dann können Sie diese ID auf dieser Site eingeben, die den Monat und das Jahr auflistet, in dem das jeweilige Modell gestartet wurde.

Wie in den Kommentaren unten erwähnt, ist der folgende Befehl viel schneller:

sysctl hw.model
Saaru Lindestøkke
quelle
4
system_profiler SPHardwareDataType | grep "Model Identifier"Läuft viel schneller als der vollständige Profiler, gibt jedoch den Marketingnamen nicht zurück, wie vom OP angefordert. In meiner Antwort finden Sie einen Befehl, mit dem Sie den Teil Ihrer Antwort terminalfreundlich nachschlagen können.
bmike
1
Ihre Antwort wäre Platz auf für apple.stackexchange.com/questions/40243/... aber ;-)
bmike
4
Ist bei gleicher Ausgabe sysctl hw.modelschneller als der obige Befehl.
Liyali
7

Auf El Capitan und Sierra gibt es eine Plist-Datei in einem privaten Framework mit einem Diktat von Informationen für jede Modellkennung. Dieses Gebot enthält den Markennamen (der das Modelljahr enthält). Ich weiß nicht, mit welcher Betriebssystemversion diese bestimmte Datei geliefert wurde, aber sie ist NICHT auf Snow Leopard (das einzige, was ich habe, ist älter als 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

Sie könnten das also verwenden (oder ähnliche Tricks für andere Betriebssystemversionen, nachdem Sie die Betriebssystemversion überprüft haben, wenn Sie diese Tricks kennen, die ich nicht kenne), und wenn dies nicht zutreffend wäre, könnten Sie immer auf den Ansatz zurückgreifen das erfordert einen Internetzugang.

Dies ist nicht genau das Gleiche wie "Über diesen Mac", in meinem Fall "
MacBook Pro" (Retina, 13-Zoll, Anfang 2015),
während
"13" MacBook Pro "mit Retina-Display (Anfang 2015) angezeigt wird,
jedoch in lesbarer Form Ich denke, es ist nah genug.

Richard Hamilton
quelle
Mir ist klar, dass diese Antwort über 2 Jahre alt ist, aber die Modellkennung wurde fest codiert (Zeile 4 MacBookPro12,1), was bedeutet, dass Sie immer auf einem 13-
Zoll-MBP von
Ein anderer Weg:/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

Spät zum Spiel, aber hier ist ein Ansatz:

hardware_model () {

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

.

Diese Funktion liest eine plist-Datei und sucht CPU Namesin dieser Datei nach:

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

und dann mit dem Trennzeichen "das vierte Feld auslesen:

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

Getestet, um auf den aktuell unterstützten Versionen von OS X zu funktionieren.

Marshki
quelle
Dies ist der einfachste Ansatz, der für mich bei Catalina funktioniert hat. Die anderen Antworten mit mehr Stimmen erfordern einen Internetzugang oder geben die irreführende Modellkennung zurück. Beispielsweise entspricht "MacBookPro15,1" den MBPs 2018 und 2019. Ich würde es noch weiter vereinfachen, nur mit: defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' | cut -sd '"' -f 4 | uniq
Kamal
3

Hier ist ein Einzeiler mit PlistBuddy, ohne Grep, Sed oder 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

das ergibt so etwas wie:

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

-

Ein weiterer Liner, der eine etwas andere Saite ergibt, ebenfalls mit PlistBuddy (mit etwas 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)

Dies verdanken wir mehreren der oben genannten Antworten.

tabrindle
quelle
1

Kombiniert man Saarus Antwort mit einer debuggten Version von Richard Hamiltons , so erhält man die folgende, die von 10.6 bis 10.12 funktioniert (obwohl die Stichprobengröße bei 10.6 nur eine Maschine ist) und möglicherweise früher / später und nicht von einer Verbindung zu abhängig ist Das Internet und Apples Server ändern sich nicht

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

Einige Anmerkungen zu dem, was ich hier gefunden habe:

  • Wir müssen ".plist" von der Domain entfernen defaults, um in 10.6 arbeiten zu können, und es daher manuell zu den Shell- -fTests hinzufügen
  • Die -nMarkierung sysctlbedeutet, dass nur der Wert gedruckt wird, was uns etwas sedoder awkArbeit erspart
Piersg
quelle
0

Wir haben einige 2019 MBPs die Rückkehr anderes Jahr Modelle für die beiden Einzeiler veröffentlicht von tabrindle .

Sein erster Einzeiler (mit sysctl -n hw.model) gibt 2018 für ein Modell von 2019 zurück:

Falsch: 15 "MacBook Pro mit Thunderbolt 3 und Touch ID (Mitte 2018)

Aber sein zweiter Einzeiler (mit system_profiler SPHardwareDataType) gibt den korrekten Namen zurück:

Rechts: MacBook Pro (15 Zoll, 2019)

Steven Klein
quelle
-7

Das sollte es tun:

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
quelle
3
Keiner der von Ihnen aufgelisteten Befehle führt das aus, was der Fragesteller verlangt.
Saaru Lindestøkke