L'anno modello di un Mac può essere determinato con un comando terminale?


58

Qualcuno conosce un comando terminale che mi dà il modello del mio Mac?

Ad esempio: "MacBook Pro, Retina, 13 pollici, metà 2013" o "MacBook Pro, fine 2009" o "Mac Mini, inizio 2010".

Tali informazioni non esistono in SystemProfiler ( /usr/sbin/system_profiler SPHardwareDataType), ma in OS X 10.7 e OS X 10.8 è possibile visualizzare tali informazioni quando si fa clic su "Ulteriori informazioni ..." nella finestra "Informazioni su questo Mac".


1
Non credo che esista un comando per identificare direttamente un Mac come "Fine 2009". Tuttavia, può essere derivato dall'identificatore del modello, vedere la mia risposta per una spiegazione. Cosa intendi con But in OS X 10.7 and 10.8...frase? Quando guardo nella finestra Informazioni su questo Mac non vedo nulla che indichi la fine del 2009 o qualcosa di simile.
Saaru Lindestøkke,

2
@BartArondson - il 10.8 lo schermo Informazioni su questo Mac mostra Mac Mini su una riga e poi fine 2012 su quella successiva
user151019

Ah lo vedo adesso. È quando fai clic su About This Mace poi su More Info.... Non ho idea di come ottenere tali informazioni nel tuo terminale.
Saaru Lindestøkke,

Risposte:


69

È possibile ottenere indirettamente queste informazioni da una pagina Web e dal comando arricciatura. In passato questo URL è stato rimosso e valutato in modo limitato e messo dietro una sorta di captcha per impedire questo utilizzo, quindi potrebbe essere necessario ricorrere ad altri viali come https://checkcoverage.apple.com/ in quel caso.

A seconda che il numero seriale sia lungo 11 o 12 caratteri, prendi rispettivamente gli ultimi 3 o 4 caratteri e inseriscili nel seguente URL dopo la parte ? Cc = XXXX . Se il tuo numero seriale era di 12 caratteri e terminava con DJWR, emettevi questo comando:

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

Per ottenere il numero di serie, utilizzare il comando seguente:

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

Pertanto, potresti avere un comando complicato per interrogare Internet se hai bisogno di un singolo comando:

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

e quindi eseguire l'output di quello tramite sed per tagliare alla parte chiave

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

C'era un file di libreria privata con questi mapping in modo da poterlo consultare offline, ma ho notato che era sparito dal 10.8.3 (e forse prima) quindi il trucco sopra è l'unico che conosco che funziona sul sistema operativo attuale senza librerie di terzi.

Alcuni simpatici libarari di terze parti forniscono uno sguardo a questo:

Si noti che a partire da novembre 2017, Apple ha costretto l'uso di httpsover httpper questo servizio.


Un'altra domanda. Se inserisco l'ultima opzione che mi hai dato nel terminale ottengo questo: <? Xml version = "1.0" encoding = "utf-8"?> <root> <name> CPU Name </name> <configCode> iMac (27 -inch, Late 2009) </configCode> <locale> en_US </locale> </root> ". È possibile ottenere" (27 pollici, Late 2009) "? Tanks: P
Mac

Quindi, la schermata Ulteriori informazioni (quella menzionata dall'OP) ottiene le sue informazioni da un database online? Il nome commerciale non è memorizzato localmente da qualche parte se viene visualizzato lì?
Saaru Lindestøkke,

Penso che sia su un database. Ma nel mio caso non è un problema: P Ma se riesco a ottenerlo senza Internet sarebbe ovviamente bello. Ma se solo riuscissi a ottenere il testo "(27 pollici, fine 2009)" sarebbe fantastico! Saluti
Mac

Suppongo che il sistema lo memorizzi nella cache durante la registrazione o che esiste un SDK interno privato per ottenere le informazioni. In passato era nel ServerKit del framework privato, quindi è chiaramente privo di documenti e è già cambiato. So che Mac può mostrare le informazioni senza una connessione Internet, ma non so davvero se è memorizzato nella cache o determinato al momento dell'installazione e codificato.
bmike

2
Simile all'utilizzo sysctl -n hw.modelmenzionato di seguito, ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'funzionerà più velocemente per ottenere il numero di serie.
n8felton,

37

Puoi usare il comando

system_profiler SPHardwareDataType | grep "Model Identifier"

nel Terminale per ottenere l'ID modello della tua macchina.
Quindi puoi inserire quell'ID su questo sito che elencherà il mese e l'anno in cui è stato lanciato il modello specifico.

Come menzionato nei commenti seguenti, il seguente comando è molto più veloce:

sysctl hw.model

4
system_profiler SPHardwareDataType | grep "Model Identifier"funziona molto più velocemente dell'intero profiler, ma non restituisce ancora il nome commerciale come richiesto dall'OP. Vedi la mia risposta per un comando che aggira la parte "cerca" della tua risposta in modo intuitivo.
bmike

1
La tua risposta sarebbe perfetta per apple.stackexchange.com/questions/40243/… tuttavia ;-)
bmike

4
Per lo stesso output, sysctl hw.modelè più veloce del comando precedente.
Liyali,

7

Su El Capitan e Sierra, c'è un file plist in un framework privato con un dettato di informazioni per ciascun identificatore del modello; quel dict include il nome commerciale (che contiene l'anno modello). Non so con quale versione di sistema operativo sia arrivato quel particolare file, ma NON è su Snow Leopard (l'unica cosa che ho più vecchia di 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

Quindi, potresti usare quello (o altri trucchi simili per altre versioni del sistema operativo dopo aver verificato la versione del sistema operativo, se conosci quei trucchi, che non lo so), e se ciò non fosse applicabile, potresti sempre ricorrere all'approccio che richiede l'accesso a Internet.

Questo non è esattamente lo stesso di ciò che mostra questo Mac, che nel mio caso è
MacBook Pro (Retina, 13 pollici, inizio 2015)
mentre mostra
MacBook Pro 13 "con display Retina (inizio 2015)
ma in termini leggibili dall'uomo , Penso che sia abbastanza vicino.


Mi rendo conto che questa risposta ha più di 2 anni, ma ha ottenuto l'identificatore del modello hardcoded (riga 4 MacBookPro12,1) , il che significa che sostiene sempre che sei su un 13 "mbp all'inizio del 2015.
eg

Un altro modo:/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 il

4

In ritardo al gioco, ma ecco un approccio:

hardware_model () {

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

.

Questa funzione legge un file plist, cerca CPU Namesall'interno di quel file:

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

, quindi utilizzando il delimitatore "analizza il quarto campo:

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

Testato per funzionare con le versioni attualmente supportate di OS X.


Questo è l'approccio più semplice che in realtà ha funzionato per me su Catalina. Le altre risposte con più voti richiedono l'accesso a Internet o restituiscono l'identificatore del modello, che è fuorviante. Ad esempio, "MacBookPro15,1" corrisponde agli MBP 2018 e 2019. Lo semplificherei ancora di più, solo con: defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' | cut -sd '"' -f 4 | uniq
Kamal,

3

Ecco una fodera che usa PlistBuddy, senza grep, sed o 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

questo restituisce qualcosa del tipo:

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

-

Un altro liner che produce una stringa leggermente diversa, usando anche PlistBuddy (con un po 'di 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)

Ringraziamo molte delle risposte sopra per questo.


1

Combinando la risposta di Saaru con una versione di debug di Richard Hamilton ottengo quanto segue, che funziona dal 10.6 al 10.12 (anche se la dimensione del campione su 10.6 è solo una macchina) e possibilmente prima / dopo, e non dipende da una connessione a Internet e i server Apple non cambiano

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

Alcune note su ciò che ho scoperto per arrivare qui:

  • Dobbiamo rimuovere ".plist" dal dominio defaultsaffinché funzioni in 10.6 e quindi aggiungerlo di nuovo manualmente ai -ftest della shell
  • la -nbandiera sysctlsignifica che stampa solo il valore, salvandoci sedo awklavorando

0

Abbiamo alcuni MBP 2019 che restituiscono modelli di anni diversi per i due one-liner pubblicati da tabrindle .

Il suo primo one-liner (usando sysctl -n hw.model) restituisce il 2018 per un modello 2019:

Sbagliato: MacBook Pro da 15 "con Thunderbolt 3 e Touch ID (metà 2018)

Ma il suo secondo one-liner (usando system_profiler SPHardwareDataType) restituisce il nome corretto:

A destra: MacBook Pro (15 pollici, 2019)


-7

Questo dovrebbe farlo:

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

3
Nessuno dei comandi che hai elencato fa quello che fa la domanda.
Saaru Lindestøkke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.