Czy rok modelowy komputera Mac można określić za pomocą polecenia terminalowego?

58

Czy ktoś zna polecenie terminalu, które daje mi model mojego komputera Mac?

Na przykład - „MacBook Pro, Retina, 13-calowy, połowa 2013 r.” Lub „MacBook Pro, koniec 2009 r.” Lub „Mac Mini, początek 2010 r.”.

Ta informacja nie istnieje w SystemProfiler ( /usr/sbin/system_profiler SPHardwareDataType), ale w OS X 10.7 i OS X 10.8 możesz zobaczyć te informacje po kliknięciu „Więcej informacji ...” w oknie „O tym Macu”.

Prochowiec
źródło
1
Nie sądzę, aby istniało polecenie pozwalające bezpośrednio zidentyfikować komputer Mac jako „koniec 2009 roku”. Jednak można go wyprowadzić z identyfikatora modelu, wyjaśnienia znajdują się w mojej odpowiedzi. Co rozumiesz przez But in OS X 10.7 and 10.8...zdanie? Kiedy patrzę w okno About This Mac, nie widzę niczego, co mówi o końcu 2009 roku lub czegoś podobnego.
Saaru Lindestøkke
2
@BartArondson - w wersji 10.8 ekran Informacje o tym komputerze Mac pokazuje Mac Mini w jednej linii, a następnie pod koniec 2012 r. W następnej
użytkownik151019
Ach, teraz to widzę. To kiedy klikniesz, About This Maca następnie włączysz More Info.... Nie mam pojęcia, jak uzyskać te informacje w swoim terminalu.
Saaru Lindestøkke,

Odpowiedzi:

69

Możesz uzyskać te informacje pośrednio ze strony internetowej i polecenia curl. W przeszłości ten adres URL był usuwany, a stawki podlegały ograniczeniom i pozostawione za jakimś captcha, aby uniemożliwić to użycie, więc w takim przypadku może być konieczne skorzystanie z innych dróg, takich jak https://checkcoverage.apple.com/ .

W zależności od tego, czy Twój numer seryjny ma długość 11 czy 12 znaków, weź odpowiednio 3 lub 4 ostatnie znaki i umieść je pod następującym adresem URL po części ? Cc = XXXX . Jeśli twój numer seryjny miał 12 znaków i zakończył się na DJWR, wydasz następujące polecenie:

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

Aby uzyskać numer seryjny, użyj następującego polecenia:

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

Tak więc możesz mieć skomplikowane polecenie, aby wysłać zapytanie do Internetu, jeśli potrzebujesz jednego polecenia:

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

a następnie przeprowadź wynik przez sed, aby przejść do kluczowej części

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

Kiedyś znajdował się prywatny plik biblioteki z tymi mapowaniami, więc możesz zajrzeć do niego offline, ale zauważyłem, że zniknął z 10.8.3 (i być może wcześniej), więc powyższa sztuczka jest jedyną, którą znam, która działa na obecnym systemie operacyjnym bez bibliotek stron trzecich.

Niektóre fajne biblioteki stron trzecich przedstawiają to:

Należy pamiętać, że od listopada 2017 r. Apple wymusiło użycie tej opcji httpsw httpprzypadku tej usługi.

bmike
źródło
Jeszcze jedno pytanie. Jeśli wstawię ostatnią opcję, którą mi dałeś w terminalu, otrzymam to: <? Xml version = "1.0" encoding = "utf-8"?> <root> <nazwa> Nazwa procesora </name> <configCode> iMac (27 -inch, koniec 2009 r.) </configCode> <locale> en_US </locale> </root> ". Czy można po prostu dostać„ (27-calowy, koniec 2009 r.) "? Zbiorniki: P
Mac
Czy zatem ekran Więcej informacji (ten, o którym wspomina OP), pobiera informacje z internetowej bazy danych? Czy nazwa marketingowa nie jest gdzieś przechowywana lokalnie, jeśli jest tam wyświetlana?
Saaru Lindestøkke,
Myślę, że jest w bazie danych. Ale w moim przypadku nie stanowi to problemu: P Ale jeśli uda mi się go uzyskać bez internetu, byłoby oczywiście świetnie. Ale gdybym tylko mógł uzyskać tekst „(27-calowy, koniec 2009 r.)”, Byłoby świetnie! Pozdrawiam
Mac
Domyślam się, że system buforuje go podczas rejestracji lub istnieje prywatny wewnętrzny zestaw SDK do uzyskiwania informacji. Kiedyś znajdował się w prywatnym frameworku ServerKit - więc jest wyraźnie nieudokumentowany i już się zmienił. Wiem, że Mac może wyświetlać te informacje bez połączenia z Internetem - ale tak naprawdę nie wiem, czy są przechowywane w pamięci podręcznej lub ustalane w czasie instalacji i zapisane na stałe.
bmike
2
Podobne do korzystania z sysctl -n hw.modelwymienionych poniżej, ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'będzie działać szybciej w celu uzyskania numeru seryjnego.
n8felton,
37

Możesz użyć polecenia

system_profiler SPHardwareDataType | grep "Model Identifier"

w terminalu, aby uzyskać identyfikator modelu urządzenia.
Następnie możesz wprowadzić ten identyfikator na tej stronie, która będzie zawierała miesiąc i rok uruchomienia danego modelu.

Jak wspomniano w komentarzach poniżej, następujące polecenie jest znacznie szybsze:

sysctl hw.model
Saaru Lindestøkke
źródło
4
system_profiler SPHardwareDataType | grep "Model Identifier"działa znacznie szybciej niż pełny profiler, ale nadal nie zwraca nazwy marketingowej, o co poprosił PO. Zobacz moją odpowiedź na polecenie, które działa w części „odszukaj” twojej odpowiedzi w przyjazny dla terminalu sposób.
bmike
1
Twoja odpowiedź byłaby na miejscu dla apple.stackexchange.com/questions/40243/… jednak ;-)
bmike
4
Dla tego samego wyjścia sysctl hw.modeljest szybszy niż powyższe polecenie.
Liyali
7

W El Capitan i Sierra znajduje się plik plist w prywatnym środowisku ze szkicem informacji dla każdego identyfikatora modelu; dykt ten zawiera nazwę marketingową (która zawiera rok modelowy). Nie wiem, z jaką wersją systemu operacyjnego przyszedł ten konkretny plik, ale NIE jest on w systemie Snow Leopard (jedyne, co mam, to starszy niż 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

Więc możesz użyć tego (lub innych podobnych sztuczek dla innych wersji systemu operacyjnego po sprawdzeniu wersji systemu operacyjnego, jeśli znasz te sztuczki, których ja nie znam), a jeśli to nie miało zastosowania, zawsze możesz wrócić do tego podejścia który wymaga dostępu do Internetu.

Nie jest to dokładnie to samo, co pokazuje About This Mac, którym w moim przypadku jest
MacBook Pro (Retina, 13-calowy, początek 2015 r.),
Podczas gdy pokazuje
13 -calowy MacBook Pro z wyświetlaczem Retina (początek 2015 r.),
Ale w kategoriach czytelnych dla człowieka Myślę, że jest wystarczająco blisko.

Richard Hamilton
źródło
Zdaję sobie sprawę, że ta odpowiedź ma ponad 2 lata, ale otrzymała identyfikator modelu zakodowany na sztywno (linia 4 MacBookPro12,1), co oznacza, że zawsze twierdzi, że jesteś na początku 2015 r. 13 "Mb.
np.
Innym sposobem:/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

Późno do gry, ale oto jedno podejście:

hardware_model () {

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

.

Ta funkcja odczytuje plik plist, szuka CPU Namesw tym pliku:

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

, a następnie użycie separatora "analizuje czwarte pole:

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

Testowany do pracy z obecnie obsługiwanymi wersjami OS X.

marshki
źródło
To najprostsze podejście, które faktycznie działało dla mnie na Catalinie. Inne odpowiedzi z większą liczbą głosów wymagają dostępu do Internetu lub zwracają identyfikator modelu, który wprowadza w błąd. Na przykład „MacBookPro15,1” odpowiada programom MBP 2018 i 2019. Uproszczę to jeszcze bardziej, po prostu: defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' | cut -sd '"' -f 4 | uniq
Kamal
3

Oto jeden linijka za pomocą PlistBuddy, bez grep, sed ani 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

zwraca to coś takiego:

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

-

Kolejna linijka, która daje nieco inny ciąg, również przy użyciu PlistBuddy (z odrobiną 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)

Podziękowania dla kilku powyższych odpowiedzi.

tabrindle
źródło
1

Łącząc odpowiedź Saaru z debugowaną wersją Richarda Hamiltona otrzymuję następujące, które działają od 10.6 do 10.12 (chociaż wielkość próbki na 10.6 to tylko jedna maszyna) i prawdopodobnie wcześniej / później i nie zależy od połączenia z Internet i serwery Apple się nie zmieniają

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

Kilka notatek o tym, co odkryłem, aby się tu dostać:

  • Musimy usunąć „.plist” z domeny, defaultsaby działał w 10.6, i dlatego ponownie dodaj go ręcznie do -ftestów powłoki
  • -nflag do sysctlśrodków drukuje tylko wartość, oszczędzając nam kilka sedlub awkpracę
Piersg
źródło
0

Mamy kilka programów MBP 2019, które zwracają modele różnych lat dla dwóch jedno-liniowych opublikowanych przez tabrindle .

Jego pierwszy jednokreskowy (korzystający sysctl -n hw.model) zwraca 2018 dla modelu 2019:

Źle: 15-calowy MacBook Pro z Thunderbolt 3 i Touch ID (połowa 2018 r.)

Ale jego druga linijka (używając system_profiler SPHardwareDataType) zwraca poprawną nazwę:

Po prawej: MacBook Pro (15-calowy, 2019)

Steven Klein
źródło
-7

To powinno to zrobić:

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
źródło
3
Żadne z wymienionych poleceń nie robi tego, o co pytający pyta.
Saaru Lindestøkke,