O ano modelo de um Mac pode ser determinado com um Comando Terminal?


58

Alguém conhece um comando do terminal que me dê o modelo do meu Mac?

Por exemplo - "MacBook Pro, Retina, 13 polegadas, meados de 2013" ou "MacBook Pro, final de 2009" ou "Mac Mini, início de 2010".

Essas informações não existem no SystemProfiler ( /usr/sbin/system_profiler SPHardwareDataType), mas no OS X 10.7 e OS X 10.8 você pode vê-las ao clicar em "Mais informações ..." na janela "Sobre este Mac".


1
Eu não acho que exista um comando para identificar um Mac como "Final de 2009" diretamente. No entanto, pode ser derivado do Identificador de Modelo, veja minha resposta para uma explicação. O que você quer dizer com But in OS X 10.7 and 10.8...frase? Quando olho na janela Sobre este Mac, não vejo nada que indique o final de 2009 ou algo semelhante.
Saaru Lindestøkke

2
@BartArondson - em 10,8 a tela para Sobre este Mac mostra Mac Mini em uma linha, em seguida, o final de 2012 na próxima
user151019

Ah, eu vejo agora. É quando você clica About This Mace depois liga More Info.... Não tenho idéia de como obter essas informações no seu terminal.
Saaru Lindestøkke

Respostas:


69

Você pode obter indiretamente essas informações de uma página da web e do comando curl. No passado, esse URL era reduzido e com taxa limitada e colocado atrás de algum tipo de captcha para impedir esse uso; portanto, talvez você precise recorrer a outros caminhos como https://checkcoverage.apple.com/ nesse caso.

Dependendo se o número de série tiver 11 ou 12 caracteres, use os últimos 3 ou 4 caracteres, respectivamente, e alimente-os no seguinte URL após a parte ? Cc = XXXX . Se o seu número de série tivesse 12 caracteres e terminasse em DJWR, você emiteria este comando:

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

Para obter seu número de série, use o seguinte comando:

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

Portanto, você pode ter um comando complicado para consultar a Internet se precisar de um único comando:

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

e, em seguida, execute a saída disso através do sed para cortar a parte principal

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

Costumava haver um arquivo de biblioteca privada com esses mapeamentos para que você pudesse consultá-lo offline, mas notei que ele havia desaparecido a partir da 10.8.3 (e talvez mais cedo), portanto o truque acima é o único que eu sei que funciona no sistema operacional atual sem bibliotecas de terceiros.

Algumas boas bibliotecas de terceiros fornecem uma olhada nisso:

Observe que, a partir de novembro de 2017, a Apple forçou o uso de httpsmais httpdeste serviço.


Mais uma pergunta. Se eu colocar a última opção que você me deu no terminal, recebo: <? Xml version = "1.0" encoding = "utf-8"?> <root> <name> Nome da CPU </name> <configCode> iMac (27 -inch, final de 2009) </configCode> <locale> en_US </locale> </root> ". É possível obter apenas" (27 polegadas, final de 2009) "? Tanques: P
Mac

Então, a tela Mais informações (a que o OP menciona) obtém suas informações de um banco de dados on-line? O nome do marketing não é armazenado localmente em algum lugar, se for exibido lá?
Saaru Lindestøkke

Eu acho que está em um banco de dados. Mas no meu caso não é um problema: P Mas se eu puder obtê-lo sem internet, seria ótimo, é claro. Mas se eu conseguir o texto "(27 polegadas, final de 2009)", isso seria ótimo! Saudações
Mac

Meu palpite é que o sistema o armazena em cache durante o registro ou existe um SDK interno interno para obter as informações. Costumava estar na estrutura privada ServerKit - portanto, é claramente indocumentado e já foi alterado. Sei que o Mac pode mostrar as informações sem uma conexão à Internet - mas não sei se elas estão armazenadas em cache ou determinadas no momento da instalação e codificadas.
Bmike

2
Semelhante ao uso sysctl -n hw.modelmencionado abaixo, ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'funcionará mais rápido para obter o número de série.
N8felton 28/09

37

Você pode usar o comando

system_profiler SPHardwareDataType | grep "Model Identifier"

no Terminal para obter o ID do modelo da sua máquina.
Em seguida, você pode inserir esse ID neste site, que listará o mês e o ano em que o modelo específico foi lançado.

Conforme mencionado nos comentários abaixo, o seguinte comando é muito mais rápido:

sysctl hw.model

4
system_profiler SPHardwareDataType | grep "Model Identifier"executa muito mais rápido que o criador de perfil completo, mas ainda não retorna o nome de marketing conforme solicitado pelo OP. Veja minha resposta para um comando que contorna a parte "pesquisar" de sua resposta de maneira amigável ao terminal.
Bmike

1
Sua resposta seria no local para apple.stackexchange.com/questions/40243/... no entanto ;-)
bmike

4
Para a mesma saída, sysctl hw.modelé mais rápido que o comando acima.
Liyali

7

Em El Capitan e Sierra, há um arquivo plist em uma estrutura privada com um ditado de informações para cada identificador de modelo; esse ditado inclui o nome de marketing (que possui o ano do modelo). Não sei com qual versão do SO esse arquivo específico veio, mas NÃO está no Snow Leopard (a única coisa que tenho que é mais antiga 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

Portanto, você pode usar isso (ou outros truques semelhantes para outras versões do sistema operacional depois de verificar a versão do sistema operacional, se você conhece esses truques, o que eu não conheço) e, se isso não for aplicável, você sempre poderá voltar à abordagem isso requer acesso à Internet.

Não é exatamente o mesmo que o About This Mac mostra, que no meu caso é o
MacBook Pro (Retina, 13 polegadas, início de 2015),
enquanto mostra o
MacBook Pro de 13 "com tela Retina (início de 2015),
mas em termos legíveis por humanos , Acho que está perto o suficiente.


Sei que esta resposta é mais de 2 anos de idade, mas é chegado o modelo identificador codificado (linha 4, MacBookPro12,1) o que significa que sempre afirma que você está em um início de 2015 13" MBP.
egid

Outra maneira:/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 do jogo, mas aqui está uma abordagem:

hardware_model () {

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

.

Esta função lê um arquivo plist, procura CPU Namesdentro desse arquivo:

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

, em seguida, usar o delimitador "analisa o quarto campo:

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

Testado para funcionar nas versões atualmente suportadas do OS X.


Essa é a abordagem mais simples que realmente funcionou para mim na Catalina. As outras respostas com mais votos requerem acesso à Internet ou retornam o Identificador de modelo, o que é enganoso. Por exemplo, "MacBookPro15,1" corresponde aos MBP de 2018 e 2019. Eu simplificaria ainda mais, apenas com: defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' | cut -sd '"' -f 4 | uniq
Kamal

3

Aqui está um liner usando o PlistBuddy, sem nenhum 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

isso retorna algo como:

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

-

Outro liner que produz uma string ligeiramente diferente, também usando o PlistBuddy (com um pouquinho 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)

Agradecemos a várias das respostas acima por isso.


1

Combinando a resposta de Saaru com uma versão depurada das de Richard Hamilton , eu obtenho o seguinte, que funciona de 10,6 a 10,12 (embora o tamanho da amostra em 10,6 seja apenas uma máquina) e possivelmente mais cedo / mais tarde, e não depende de uma conexão com a internet e os servidores da Apple não mudam

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

Algumas notas sobre o que descobri para chegar aqui:

  • Temos que retirar o ".plist" do domínio para defaultsfuncionar na versão 10.6 e, portanto, adicioná-lo manualmente aos -ftestes de shell
  • o -nsinalizador sysctlsignifica que ele imprime apenas o valor, economizando um pouco sedou awktrabalhando

0

Temos alguns MBPs de 2019 que retornam modelos de ano diferentes para as duas linhas postadas por tabrindle .

Seu primeiro one-liner (usando sysctl -n hw.model) retorna 2018 para um modelo de 2019:

Errado: MacBook Pro de 15 "com Thunderbolt 3 e Touch ID (meados de 2018)

Mas seu segundo one-liner (using system_profiler SPHardwareDataType) retorna o nome correto:

Direita: MacBook Pro (15 polegadas, 2019)


-7

Isso deve servir:

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
Nenhum dos comandos listados faz o que a pergunta é feita.
Saaru Lindestøkke
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.