Можно ли определить год выпуска Mac с помощью команды терминала?

58

Кто-нибудь знает команду терминала, которая дает мне модель моего Mac?

Например - «MacBook Pro, Retina, 13-дюймовый, середина 2013 года» или «MacBook Pro, конец 2009 года» или «Mac Mini, начало 2010 года».

Эта информация не существует в SystemProfiler ( /usr/sbin/system_profiler SPHardwareDataType), но в OS X 10.7 и OS X 10.8 вы можете увидеть эту информацию, когда нажимаете «Подробнее ...» в окне «Об этом Mac».

макинтош
источник
1
Я не думаю, что существует команда для непосредственного определения Mac как «конца 2009 года». Однако это может быть получено из Идентификатора модели, см. Мой ответ для объяснения. Что вы подразумеваете под But in OS X 10.7 and 10.8...предложением? Когда я смотрю в окне «Об этом Mac», я не вижу ничего, что бы указывало на конец 2009 года или что-то подобное.
Saaru Lindestøkke
2
@BartArondson - на 10.8 экран «Об этом Mac» показывает Mac Mini на одной строке, а затем конец 2012 года на следующей
user151019
Ах, я вижу это сейчас. Это когда вы нажимаете, About This Macа затем на More Info.... Я понятия не имею, как получить эту информацию в вашем терминале.
Saaru Lindestøkke

Ответы:

69

Вы можете косвенно получить эту информацию с веб-страницы и команды curl. В прошлом этот URL-адрес был удален и ограничен по скорости, а за ним скрыта какая-то капча для предотвращения такого использования, поэтому вам, возможно, придется прибегнуть к другим возможностям, таким как https://checkcoverage.apple.com/ в этом случае.

В зависимости от того, является ли ваш серийный номер длиной 11 или 12 символов, возьмите последние 3 или 4 символа соответственно и передайте его по следующему URL после части ? Cc = XXXX . Если ваш серийный номер состоял из 12 символов и заканчивался на DJWR, вы должны выполнить эту команду:

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

Чтобы получить серийный номер, используйте следующую команду:

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

Таким образом, у вас может быть сложная команда для запроса интернета, если вам нужна одна команда:

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

а затем запустите вывод этого через sed, чтобы сократить до ключевой части

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

Раньше был файл частной библиотеки с этими сопоставлениями, чтобы вы могли обращаться к нему в автономном режиме, но я заметил, что он пропал с 10.8.3 (и, возможно, ранее), так что вышеупомянутый трюк - единственный, который я знаю, который работает на текущей ОС без сторонних библиотек.

Несколько хороших библиотек сторонних производителей обеспечивают поиск этого:

Следует отметить , что по состоянию на ноябрь 2017 года, Apple была вынуждена использовать httpsза кадром httpдля этой службы.

bmike
источник
Еще один вопрос. Если я добавлю последний параметр, который вы мне дали, в терминале, я получу следующее: <? Xml version = "1.0" encoding = "utf-8"?> <Root> <name> CPU Name </ name> <configCode> iMac (27 -inch, конец 2009 г.) </ configCode> <locale> en_US </ locale> </ root> ". Можно ли просто получить" (27 дюймов, конец 2009 г.) "? Танки: P
Mac,
Итак, получает ли экран «Дополнительная информация» (тот, который упоминается в ОП) информацию из онлайновой базы данных? Разве маркетинговое название не хранится где-то локально, если оно там отображается?
Saaru Lindestøkke
Я думаю, что это в базе данных. Но в моем случае это не проблема: P Но если бы я мог получить это без интернета, это было бы здорово, конечно. Но если бы я только смог получить текст «(27 дюймов, конец 2009 года)», это было бы здорово! С наилучшими пожеланиями
Mac
Я предполагаю, что система кеширует ее при регистрации, или для получения информации существует частный внутренний SDK. Раньше он находился в частной структуре ServerKit - поэтому он явно недокументирован и уже изменился. Я знаю, что Mac может показывать информацию без подключения к интернету, но я не знаю, кешируется ли она или определяется во время установки и жестко закодирована.
bmike
2
Подобно использованию, sysctl -n hw.modelуказанному ниже, ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'будет работать быстрее для получения серийного номера.
n8felton
37

Вы можете использовать команду

system_profiler SPHardwareDataType | grep "Model Identifier"

в Терминале, чтобы получить идентификатор модели вашей машины.
Затем вы можете ввести этот идентификатор на этом сайте, где будет указан месяц и год выпуска конкретной модели.

Как упоминалось в комментариях ниже, следующая команда намного быстрее:

sysctl hw.model
Саару Линдестёкке
источник
4
system_profiler SPHardwareDataType | grep "Model Identifier"работает намного быстрее, чем полный профилировщик, но по-прежнему не возвращает маркетинговое имя, как просил OP. Посмотрите мой ответ для команды, которая работает вокруг части «поиска» вашего ответа в терминальной дружественной манере.
bmike
1
Ваш ответ будет на месте для apple.stackexchange.com/questions/40243/… однако ;-)
bmike
4
Для того же вывода sysctl hw.modelбыстрее, чем приведенная выше команда.
Лияли
7

В El Capitan и Sierra в частной структуре есть файл plist с информацией для каждого идентификатора модели; этот дикт включает маркетинговое название (в котором указан год выпуска). Я не знаю, с какой версией ОС пришел этот конкретный файл, но он НЕ на Snow Leopard (единственное, что у меня есть, старше, чем 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

Таким образом, вы можете использовать это (или другие подобные приемы для других версий ОС после проверки версии ОС, если вы знаете эти приемы, чего я не знаю), и если это не применимо, вы всегда можете прибегнуть к подходу Это требует доступа в Интернет.

Это не совсем то же самое, что показано в Об этом Mac, в моем случае это
MacBook Pro (Retina, 13-дюймовый, начало 2015 года), в
то время как это показывает
13 -дюймовый MacBook Pro с Retina-дисплеем (начало 2015 года),
но с точки зрения восприятия человеком. Я думаю, что это достаточно близко.

Ричард Гамильтон
источник
Я понимаю , что этот ответ более 2 лет, но он получил идентификатор модели зашиты (строка 4, MacBookPro12,1) , что означает , что он всегда утверждает , что вы находитесь на ранней 2015 13" MBP.
EGID
Другой способ:/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

Поздно к игре, но вот один из подходов:

hardware_model () {

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

,

Эта функция читает файл plist, ищет CPU Namesв этом файле:

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

затем с помощью разделителя "анализирует четвертое поле:

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

Протестировано для работы на поддерживаемых в настоящее время версиях OS X.

marshki
источник
Это самый простой подход, который действительно работал для меня на Каталине. Другие ответы с большим количеством голосов требуют доступа в Интернет или возврата идентификатора модели, который вводит в заблуждение. Например, «MacBookPro15,1» соответствует MBP 2018 и 2019 годов. Я бы упростил это еще больше, просто с: defaults read ~/Library/Preferences/com.apple.SystemProfiler.plist 'CPU Names' | cut -sd '"' -f 4 | uniq
Камаль
3

Вот один вкладыш, использующий PlistBuddy, без каких-либо grep, sed или 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

это возвращает что-то вроде:

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

-

Еще один лайнер, который выдает немного другую строку, также используя PlistBuddy (с небольшим количеством 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)

Отдайте несколько из приведенных выше ответов за это.

tabrindle
источник
1

Комбинируя ответ Саару с отлаженной версией Ричарда Гамильтона , я получаю следующее, которое работает с 10.6 по 10.12 (хотя размер выборки на 10.6 - это всего одна машина) и, возможно, раньше / позже, и не зависит от соединения с Интернет и серверы Apple не меняются

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

Некоторые заметки о том, что я обнаружил, чтобы получить здесь:

  • Мы должны удалить «.plist» из домена, defaultsчтобы работать в 10.6, и поэтому заново добавить его вручную в -fтесты оболочки
  • -nфлаг sysctlсредство печатает только значение, сэкономив нам некоторые sedили awkработу
Piersg
источник
0

У нас есть около 2019 MBP, которые возвращают разные модели года для двух однострочников, размещенных tabrindle .

Его первая однострочная (использующая sysctl -n hw.model) возвращает 2018 для модели 2019:

Неправильно: 15-дюймовый MacBook Pro с Thunderbolt 3 и Touch ID (середина 2018 года)

Но его вторая однострочная (с использованием system_profiler SPHardwareDataType) возвращает правильное имя:

Справа: MacBook Pro (15 дюймов, 2019 г.)

Стивен Кляйн
источник
-7

Это должно сделать это:

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
источник
3
Ни одна из перечисленных вами команд не выполняет то, что задает вопрос.
Saaru Lindestøkke