Bisakah model tahun Mac ditentukan dengan Terminal Command?

58

Apakah ada yang tahu perintah terminal yang memberi saya model Mac saya?

Misalnya - "MacBook Pro, Retina, 13 inci, Pertengahan 2013" atau "MacBook Pro, Akhir 2009" atau "Mac Mini, Awal 2010".

Informasi itu tidak ada di SystemProfiler ( /usr/sbin/system_profiler SPHardwareDataType), tetapi di OS X 10.7 dan OS X 10.8 Anda dapat melihat informasi itu ketika Anda mengklik "More Info ..." di jendela "About This Mac".

Mac
sumber
1
Saya tidak berpikir ada perintah untuk mengidentifikasi Mac sebagai "Akhir 2009" secara langsung. Namun itu dapat diturunkan dari Pengidentifikasi Model, lihat jawaban saya untuk penjelasan. Apa yang Anda maksud dengan But in OS X 10.7 and 10.8...kalimat itu? Ketika saya melihat di jendela About This Mac saya tidak melihat apa pun yang menyatakan Akhir 2009 atau sesuatu yang serupa.
Saaru Lindestøkke
2
@BartArondson - pada layar 10,8 untuk Tentang ini Mac menunjukkan Mac Mini pada satu baris kemudian Akhir 2012 pada berikutnya
user151019
Ah saya melihatnya sekarang. Saat Anda mengklik About This Macdan kemudian More Info.... Saya tidak tahu bagaimana cara mendapatkan informasi itu di terminal Anda.
Saaru Lindestøkke

Jawaban:

69

Anda dapat secara tidak langsung mendapatkan informasi ini dari halaman web dan perintah curl. Di masa lalu URL ini telah diturunkan dan nilai dibatasi dan diletakkan di belakang semacam captcha untuk mencegah penggunaan ini, jadi Anda mungkin perlu beralih ke jalan lain seperti https://checkcoverage.apple.com/ dalam hal ini.

Bergantung pada apakah nomor seri Anda panjangnya 11 atau 12 karakter, masing-masing mengambil 3 atau 4 karakter terakhir, dan memasukkannya ke URL berikut setelah bagian ? Cc = XXXX . Jika nomor seri Anda 12 karakter dan diakhiri dengan DJWR, Anda akan mengeluarkan perintah ini:

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

Untuk mendapatkan nomor seri Anda, gunakan perintah berikut:

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

Dengan demikian, Anda bisa memiliki perintah yang rumit untuk melakukan kueri di internet jika Anda memerlukan satu perintah:

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

dan kemudian jalankan output melalui sed untuk memotong ke bagian kunci

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

Dulu ada file perpustakaan pribadi dengan pemetaan ini sehingga Anda dapat berkonsultasi secara offline, tapi saya perhatikan itu sudah hilang pada 10.8.3 (dan mungkin sebelumnya) jadi trik di atas adalah satu-satunya yang saya tahu yang bekerja pada OS saat ini tanpa perpustakaan pihak ketiga.

Beberapa libarary pihak ketiga yang bagus menyajikan hal ini:

Perhatikan bahwa pada November 2017, Apple telah memaksa penggunaan httpslebih httpuntuk layanan ini.

bmike
sumber
Satu pertanyaan lagi. Jika saya menempatkan opsi terakhir yang Anda berikan kepada saya di terminal saya mendapatkan ini: <? Xml version = "1.0" encoding = "utf-8"?> <root> <name> Nama CPU </name> <configCode> iMac (27 -inch, Late 2009) </configCode> <locale> en_US </locale> </root> ". Apakah mungkin untuk mendapatkan" (27-inch, Late 2009) "? Tank: P
Mac
Jadi, apakah layar More Info (yang disebutkan OP) mendapatkan informasinya dari database online? Bukankah nama pemasaran disimpan secara lokal di suatu tempat jika itu ditampilkan di sana?
Saaru Lindestøkke
Saya pikir ini ada di database. Tetapi dalam kasus saya itu bukan masalah: P Tetapi jika saya bisa mendapatkannya tanpa internet, tentu saja akan sangat bagus. Tetapi jika saya hanya bisa mendapatkan teks "(27-inci, Akhir 2009)" itu akan bagus! Salam
Mac
Dugaan saya adalah sistem menyimpannya selama pendaftaran atau ada SDK internal pribadi untuk mendapatkan informasi. Dulu berada dalam kerangka kerja pribadi ServerKit - jadi itu jelas tidak berdokumen dan sudah berubah. Saya tahu Mac dapat menampilkan informasi tanpa koneksi internet - tetapi saya tidak benar-benar tahu apakah itu di-cache atau ditentukan pada waktu instalasi dan hard coded.
bmike
2
Mirip dengan menggunakan yang sysctl -n hw.modeldisebutkan di bawah, ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'akan bekerja lebih cepat untuk mendapatkan nomor seri.
n8felton
37

Anda bisa menggunakan perintah

system_profiler SPHardwareDataType | grep "Model Identifier"

di Terminal untuk mendapatkan ID model mesin Anda.
Kemudian Anda dapat memasukkan ID itu di situs ini yang akan mencantumkan bulan dan tahun model tertentu diluncurkan.

Seperti disebutkan dalam komentar di bawah, perintah berikut ini jauh lebih cepat:

sysctl hw.model
Saaru Lindestøkke
sumber
4
system_profiler SPHardwareDataType | grep "Model Identifier"berjalan jauh lebih cepat daripada profiler lengkap, tetapi masih tidak mengembalikan nama pemasaran seperti yang diminta OP. Lihat jawaban saya untuk perintah yang bekerja di sekitar bagian "lihat" jawaban Anda dengan cara yang ramah terminal.
bmike
1
Jawaban Anda akan tepat untuk apple.stackexchange.com/questions/40243/... namun ;-)
bmike
4
Untuk keluaran yang sama, sysctl hw.modellebih cepat dari perintah di atas.
Liyali
7

Di El Capitan dan Sierra, ada file plist dalam kerangka kerja pribadi dengan info untuk setiap pengenal model; Dict itu termasuk nama pemasaran (yang memiliki model tahun di dalamnya). Saya tidak tahu versi OS dari file mana yang masuk, tetapi BUKAN pada Snow Leopard (satu-satunya yang saya miliki yang lebih tua dari 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

Jadi, Anda bisa menggunakan itu (atau trik serupa lainnya untuk versi OS lain setelah memeriksa versi OS, jika Anda tahu trik-trik itu, yang tidak saya lakukan), dan jika itu tidak berlaku, Anda selalu bisa kembali ke pendekatan yang membutuhkan akses Internet.

Ini tidak persis sama dengan apa yang ditampilkan About This Mac, yang dalam kasus saya adalah
MacBook Pro (Retina, 13-inch, Awal 2015)
sementara ini menunjukkan
13 "MacBook Pro dengan tampilan Retina (Awal 2015)
tetapi dalam istilah yang dapat dibaca manusia , Saya pikir itu cukup dekat.

Richard Hamilton
sumber
Saya menyadari jawaban ini sudah lebih dari 2 tahun, tetapi sudah ada pengenal model yang di-hardcod (baris 4, MacBookPro12,1) yang berarti selalu mengklaim Anda berada di awal 2015 13 "mbp.
egid
Cara lain:/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

Terlambat dalam permainan, tapi inilah satu pendekatan:

hardware_model () {

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

.

Fungsi ini membaca file plist, mencari di CPU Namesdalam file itu:

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

, lalu gunakan pembatas "menguraikan bidang keempat:

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

Diuji untuk bekerja pada versi OS X yang saat ini didukung.

marshki
sumber
Ini adalah pendekatan paling sederhana yang benar-benar bekerja untuk saya di Catalina. Jawaban lain dengan suara lebih banyak membutuhkan akses internet atau mengembalikan Model Identifier, yang menyesatkan. Misalnya, "MacBookPro15, 1" sesuai dengan 2018 dan 2019 MBP. Saya akan menyederhanakannya lebih jauh, hanya dengan: defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' | cut -sd '"' -f 4 | uniq
Kamal
3

Ini adalah liner satu menggunakan PlistBuddy, tanpa grep, sed atau 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

ini mengembalikan sesuatu seperti:

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

-

Satu lagi liner yang menghasilkan string yang sedikit berbeda, juga menggunakan PlistBuddy (dengan sedikit 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)

Terima kasih atas beberapa jawaban di atas untuk ini.

tabrindle
sumber
1

Menggabungkan jawaban Saaru dengan versi Richard Hamilton yang di -debug saya mendapatkan yang berikut, yang bekerja 10,6 melalui 10,12 (meskipun ukuran sampel pada 10,6 hanya satu mesin) dan mungkin sebelumnya / nanti, dan tidak tergantung pada koneksi ke internet dan server Apple tidak berubah

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

Beberapa catatan tentang apa yang saya temukan untuk sampai di sini:

  • Kita harus menghapus ".plist" dari domain agar defaultsdapat bekerja di 10.6, dan karenanya menambahkannya kembali secara manual ke -ftes shell
  • yang -nbendera untuk sysctlsarana itu mencetak hanya nilai, menyelamatkan kita beberapa sedatau awkpekerjaan
Piersg
sumber
0

Kami memiliki sekitar 2019 MBP yang mengembalikan model tahun yang berbeda untuk dua one-liners yang diposting oleh tabrindle .

One-liner pertamanya (menggunakan sysctl -n hw.model) mengembalikan 2018 untuk model 2019:

Salah: 15 "MacBook Pro dengan Thunderbolt 3 dan Touch ID (Pertengahan 2018)

Tapi one-liner keduanya (menggunakan system_profiler SPHardwareDataType) mengembalikan nama yang benar:

Kanan: MacBook Pro (15-inci, 2019)

Steven Klein
sumber
-7

Ini harus dilakukan:

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
sumber
3
Tidak satu pun dari perintah yang Anda daftarkan melakukan apa yang diminta penanya.
Saaru Lindestøkke