¿Se puede determinar el año modelo de una Mac con un comando de terminal?

58

¿Alguien sabe un comando de terminal que me da el modelo de mi Mac?

Por ejemplo: "MacBook Pro, Retina, 13 pulgadas, mediados de 2013" o "MacBook Pro, finales de 2009" o "Mac Mini, principios de 2010".

Esa información no existe en SystemProfiler ( /usr/sbin/system_profiler SPHardwareDataType), pero en OS X 10.7 y OS X 10.8 puede ver esa información cuando hace clic en "Más información ..." en la ventana "Acerca de esta Mac".

Mac
fuente
1
No creo que exista un comando para identificar una Mac como "Finales de 2009" directamente. Sin embargo, se puede derivar del identificador de modelo, vea mi respuesta para obtener una explicación. ¿Qué quieres decir con la But in OS X 10.7 and 10.8...oración? Cuando miro en la ventana Acerca de esta Mac, no veo nada que indique Finales de 2009 o algo similar.
Saaru Lindestøkke
2
@BartArondson - en 10.8 la pantalla de Acerca de esta Mac muestra Mac Mini en una línea y luego a fines de 2012 en la siguiente
user151019
Ah ya lo veo. Es cuando haces clic en About This Macy luego en More Info.... No tengo idea de cómo obtener esa información en su terminal.
Saaru Lindestøkke

Respuestas:

69

Puede obtener indirectamente esta información desde una página web y el comando curl. En el pasado, esta URL se eliminó y se limitó su velocidad y se colocó detrás de algún tipo de captcha para evitar este uso, por lo que es posible que deba recurrir a otras vías como https://checkcoverage.apple.com/ en ese caso.

Dependiendo de si su número de serie tiene 11 o 12 caracteres, tome los últimos 3 o 4 caracteres, respectivamente, y alimente eso a la siguiente URL después de la parte ? Cc = XXXX . Si su número de serie tenía 12 caracteres y terminaba en DJWR, emitiría este comando:

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

Para obtener su número de serie, use el siguiente comando:

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

Por lo tanto, podría tener un comando complicado para consultar Internet si necesita un solo comando:

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

y luego ejecute la salida de eso a través de sed para cortar a la parte clave

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

Solía ​​haber un archivo de biblioteca privada con estas asignaciones para que pudiera consultarlo sin conexión, pero noté que desapareció a partir de 10.8.3 (y tal vez antes), por lo que el truco anterior es el único que sé que funciona en el sistema operativo actual sin bibliotecas de terceros.

Algunas buenas bibliotecas de terceros proporcionan un vistazo de esto:

Tenga en cuenta que a partir de noviembre de 2017, Apple ha forzado el uso de httpsover httppara este servicio.

bmike
fuente
Una pregunta más. Si pongo la última opción que me diste en la terminal, obtengo esto: <? Xml version = "1.0" encoding = "utf-8"?> <root> <name> CPU Name </name> <configCode> iMac (27 -inch, finales de 2009) </configCode> <locale> en_US </locale> </root> ". ¿Es posible obtener" (27 pulgadas, finales de 2009) "? Tanques: P
Mac
Entonces, ¿la pantalla Más información (la que menciona el OP) obtiene su información de una base de datos en línea? ¿No se almacena localmente el nombre de marketing en algún lugar si se muestra allí?
Saaru Lindestøkke
Creo que está en una base de datos. Pero en mi caso no es un problema: P Pero si puedo obtenerlo sin internet, sería genial, por supuesto. Pero si solo pudiera obtener el texto "(27 pulgadas, finales de 2009)" ¡sería genial! Saludos
Mac
Supongo que el sistema lo almacena en caché durante el registro o hay un SDK interno privado para obtener la información. Solía ​​estar en el framework privado ServerKit, por lo que está claramente indocumentado y ya ha cambiado. Sé que Mac puede mostrar la información sin una conexión a Internet, pero no sé si está almacenada en caché o determinada en el momento de la instalación y está codificada.
bmike
2
Similar al uso sysctl -n hw.modelmencionado a continuación, ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'funcionará más rápido para obtener el número de serie.
n8felton
37

Puedes usar el comando

system_profiler SPHardwareDataType | grep "Model Identifier"

en la Terminal para obtener la identificación del modelo de su máquina.
Luego, puede ingresar esa ID en este sitio que enumerará el mes y el año en que se lanzó el modelo en particular.

Como se menciona en los comentarios a continuación, el siguiente comando es mucho más rápido:

sysctl hw.model
Saaru Lindestøkke
fuente
44
system_profiler SPHardwareDataType | grep "Model Identifier"funciona mucho más rápido que el generador de perfiles completo, pero aún no devuelve el nombre de marketing como lo solicitó el OP. Vea mi respuesta para un comando que funciona alrededor de la parte "buscar" de su respuesta de una manera amigable.
bmike
1
Sin embargo, su respuesta sería acertada para apple.stackexchange.com/questions/40243/… ;-)
bmike
44
Para la misma salida, sysctl hw.modeles más rápido que el comando anterior.
Liyali
7

En El Capitán y Sierra, hay un archivo plist en un marco privado con un resumen de información para cada identificador de modelo; ese dict incluye el nombre comercial (que tiene el año modelo). No sé con qué versión del sistema operativo vino ese archivo en particular, pero NO está en Snow Leopard (lo único que tengo es más antiguo 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

Entonces, podría usar eso (u otros trucos similares para otras versiones del sistema operativo después de verificar la versión del sistema operativo, si conoce esos trucos, que yo no conozco), y si eso no fuera aplicable, siempre podría recurrir al enfoque eso requiere acceso a Internet.

Esto no es exactamente lo mismo que muestra About This Mac, que en mi caso es
MacBook Pro (Retina, 13 pulgadas, principios de 2015),
mientras que muestra
13 "MacBook Pro con pantalla Retina (Early 2015)
pero en términos legibles por humanos Creo que está lo suficientemente cerca.

Richard Hamilton
fuente
Soy consciente de que esta respuesta es más de 2 años de edad, pero se ha vuelto el modelo identificador hardcoded (línea 4, MacBookPro12,1) lo que significa que siempre afirma que está en un 2015 13" MBP temprano.
egid
Otra forma:/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

Tarde al juego, pero aquí hay un enfoque:

hardware_model () {

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

.

Esta función lee un archivo plist, busca CPU Namesdentro de ese archivo:

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

, luego, usando el delimitador "analiza el cuarto campo:

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

Probado para funcionar en las versiones actualmente compatibles de OS X.

marshki
fuente
Este es el enfoque más simple que realmente funcionó para mí en Catalina. Las otras respuestas con más votos requieren acceso a Internet o devolver el Identificador del modelo, lo cual es engañoso. Por ejemplo, "MacBookPro15,1" corresponde a los MBP de 2018 y 2019. Lo simplificaría aún más, solo con: defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' | cut -sd '"' -f 4 | uniq
Kamal
3

Aquí hay una línea usando PlistBuddy, sin 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

esto devuelve algo como:

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

-

Otro revestimiento que produce una cadena ligeramente diferente, también usando PlistBuddy (con un poco 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)

Acredite a varias de las respuestas anteriores por esto.

tabrindle
fuente
1

Combinando la respuesta de Saaru con una versión depurada de Richard Hamilton , obtengo lo siguiente, que funciona 10.6 a 10.12 (aunque el tamaño de la muestra en 10.6 es solo una máquina) y posiblemente antes / después, y no depende de una conexión a Internet y los servidores de Apple no cambian

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

Algunas notas sobre lo que descubrí para llegar aquí:

  • Tenemos que quitar ".plist" del dominio para defaultstrabajar en 10.6 y, por lo tanto, volver a agregarlo manualmente a las -fpruebas de shell
  • la -nbandera sysctlsignifica que solo imprime el valor, ahorrándonos algo sedo awktrabajando
Piersg
fuente
0

Tenemos algunos MBP de 2019 que devuelven modelos de diferentes años para las dos frases publicadas por tabrindle .

Su primer one-liner (usando sysctl -n hw.model) regresa 2018 para un modelo 2019:

Incorrecto: MacBook Pro de 15 "con Thunderbolt 3 y Touch ID (mediados de 2018)

Pero su segundo one-liner (usando system_profiler SPHardwareDataType) devuelve el nombre correcto:

Derecha: MacBook Pro (15 pulgadas, 2019)

Steven Klein
fuente
-7

Esto debería hacerlo:

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
fuente
3
Ninguno de los comandos que ha enumerado hace lo que hace el autor de la pregunta.
Saaru Lindestøkke