85 votos

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

¿Alguien sabe un comando de terminal que me dé 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 está en el SystemProfiler (/usr/sbin/system_profiler SPHardwareDataType), pero en OS X 10.7 y OS X 10.8 puedes ver esa información cuando haces clic en "Más información..." en la ventana de "Acerca de este Mac".

86voto

Oskar Puntos 1242

Puedes obtener esta información de forma indirecta desde una página web y utilizando el comando curl. En el pasado, esta URL ha sido eliminada, limitada en accesos y protegida con algún tipo de captcha para evitar este uso, por lo que es posible que necesites recurrir a otros medios como https://checkcoverage.apple.com/ en ese caso.

Dependiendo de si tu número de serie tiene 11 o 12 caracteres, toma los últimos 3 o 4 caracteres, respectivamente, y agrégalos a la siguiente URL después de la parte ?cc=XXXX. Si tu número de serie tiene 12 caracteres y termina en DJWR, deberías ejecutar este comando:

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

Para obtener tu número de serie, utiliza el siguiente comando:

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

Por lo tanto, podrías tener un comando complicado para consultar internet si necesitas un solo comando:

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

y luego ejecutar 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|.*\(.*\).*|\1|'

Anteriormente existía un archivo de biblioteca privado con estos mapeos para poder consultarlo sin conexión, pero noté que desapareció a partir de 10.8.3 (y posiblemente antes), por lo que el truco anterior es el único que conozco que funciona en el sistema operativo actual sin librerías de terceros.

Algunas librerías de terceros proporcionan una búsqueda de esto:

Ten en cuenta que a partir de noviembre de 2017, Apple ha obligado a utilizar https en lugar de http para este servicio.

0 votos

Hice un script un poco menos rápido y sucio para lograr esto en Python, usando analizadores XML: gist.github.com/zigg/6174270

3 votos

Similar to using sysctl -n hw.model mencionado 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.

2 votos

El ? en la URL debe ser escapado en zsh (ahora la shell predeterminada de macOS) ya que de lo contrario zsh intenta interpretarlo como un comodín de nombre de archivo.

53voto

Deecee Puntos 39

Puedes usar el comando

system_profiler SPHardwareDataType | grep "Model Identifier"

en Terminal para obtener el ID del modelo de tu máquina.
Luego puedes ingresar ese ID en este sitio que mostrará el mes y año en que se lanzó ese modelo en particular.

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

sysctl hw.model

6 votos

El comando system_profiler SPHardwareDataType | grep "Model Identifier" se ejecuta mucho más rápido que el perfilador completo, pero aún así no devuelve el nombre comercial como preguntó el OP. Consulta mi respuesta para un comando que soluciona la parte de "buscar" de tu respuesta de una manera amigable para el terminal.

1 votos

Tu respuesta sería perfecta para apple.stackexchange.com/questions/40243/… sin embargo ;-)

6 votos

Para obtener la misma salida, sysctl hw.model es más rápido que el comando anterior.

8voto

Bruce Puntos 4426

En El Capitán y Sierra, hay un archivo plist en un framework privado con un dict de información para cada identificador de modelo; ese dict incluye el nombre comercial (que tiene el año del modelo en él). No sé en qué versión de SO llegó ese archivo en particular, pero NO está en Snow Leopard (lo único que tengo que es más antiguo que El Capitán).

#! /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 "no se puede utilizar el método sin conexión para encontrar el nombre comercial en esta versión del SO"
fi

Por lo tanto, podrías usar eso (u otros trucos similares para otras versiones de SO después de verificar la versión del SO, si conoces esos trucos, lo cual no conozco), y si eso no fuera aplicable, siempre podrías recurrir al enfoque que requiere acceso a Internet.

Esto no es exactamente lo mismo que muestra Acerca de Esta Mac, que en mi caso es
MacBook Pro (Retina, 13 pulgadas, principios de 2015)
mientras que esto muestra
MacBook Pro de 13" con pantalla Retina (principios de 2015)
pero en términos legibles para humanos, creo que es lo suficientemente cercano.

0 votos

Me doy cuenta de que esta respuesta tiene más de 2 años, pero tiene el identificador del modelo codificado (línea 4, MacBookPro12,1), lo que significa que siempre afirma que estás utilizando un MacBook Pro de 13 pulgadas a principios de 2015.

2 votos

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

7voto

marshki Puntos 131

Tarde para el 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 y busca CPU Names dentro de ese archivo:

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

, luego utiliza el delimitador " para analizar el cuarto campo:

iMac (Retina 5K, 27 pulgadas, 2017) 

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

Tenga en cuenta que esto podría devolver más de una fila si el hardware fue actualizado:

{
    "JHD4-en-DE_DE" = "MacBook Pro (13 pulgadas, 2018, Cuatro puertos Thunderbolt 3)";
    "ML7M-en-DE_DE" = "MacBook Pro (13 pulgadas, 2020, Cuatro puertos Thunderbolt 3)";
}

Agregar tail -n 1 después de uniq resuelve esto al menos para este caso.

0 votos

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

0 votos

NSUserDefaults* defaults = [[NSUserDefaults alloc] init]; [defaults addSuiteNamed:@"com.apple.SystemProfiler"]; NSLog(@"%@", [[[defaults dictionaryForKey:@"CPU Names"] objectEnumerator] nextObject]);

6voto

tabrindle Puntos 141

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 así:

15" MacBook Pro con Thunderbolt 3 y Touch ID (Mediados de 2017)

-

Otra línea que genera una cadena ligeramente diferente, también utilizando 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 pulgadas, 2017)

Crédito a varias de las respuestas anteriores por esto.

2 votos

En tu primer fragmento, esto: English.lproj ahora es: en.lproj en versiones más nuevas de macOS. Uno podría lidiar con esto prefiriendo el comando con: shopt -s extglob, y luego capturando cualquiera de las posibilidades: @(English|en).lproj.

1 votos

Devuelve Entrada, ":MacBookPro18,1:_LOCALIZABLE_:marketingModel", No Existe en mi MBP M1.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X