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中,当您在“关于本机”窗口中单击“更多信息...”时,您可以看到该信息。


1
我认为没有直接将Mac识别为“ 2009年末”的命令。但是,它可以从模型标识符派生,请参阅我的答案以获取解释。这But in OS X 10.7 and 10.8...句话是什么意思?在“关于本机”窗口中查看时,看不到任何表明2009年末的内容或类似内容。
2013年

2
@BartArondson-在10.8上,关于About the Mac的屏幕在一行上显示Mac Mini,然后在下一行显示2012年末
user151019 2013年

啊,我现在看到了。这是您单击About This Mac,然后单击More Info...。我不知道如何在您的终端中获取该信息。
2013年

Answers:


69

您可以从网页和curl命令间接获取此信息。过去,此网址已被删除并进行了速率限制,并在某种形式的验证码后面加上了以防止这种使用,因此在这种情况下,您可能需要使用其他途径,例如https://checkcoverage.apple.com/

根据您的序列号是11还是12个字符长,分别取最后3个或4个字符,并将其提供给?cc = XXXX部分后面的以下URL 。如果序列号为12个字符并以DJWR结尾,则发出以下命令:

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

要获取序列号,请使用以下命令:

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

因此,如果您需要一个命令,则可以使用复杂的命令来查询Internet:

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年11月起,苹果已强制为该服务使用httpsover http


还有一个问题。如果我把您给我的最后一个选项放在终端上,我会得到:<?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年末)”?)Tanks:P
Mac

那么,“更多信息”屏幕(操作员提到的那个屏幕)是否从在线数据库中获取其信息?如果营销名称显示在本地,该名称是否存储在本地?
2013年

我认为它在数据库上。但对我而言,这不是问题:P但是,如果我不用互联网就可以得到它,那当然很好。但是,如果我只能收到文字“(27英寸,2009年末)”,那就太好了!问候
Mac

我的猜测是系统在注册过程中将其缓存,或者有一个私有的内部SDK用于获取信息。它曾经在私有框架ServerKit中-因此它显然没有文档记录,并且已经更改。我知道Mac可以在没有Internet连接的情况下显示信息-但是我真的不知道它是否在安装时缓存或确定并经过硬编码。
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"

在终端中获取机器的型号ID。
然后,您可以在站点上输入该ID, ID 将列出启动特定型号的月份和年份。

如以下注释中所述,以下命令要快得多:

sysctl hw.model

4
system_profiler SPHardwareDataType | grep "Model Identifier"它的运行速度比完整的事件探查器快得多,但仍未按照OP的要求返回营销名称。请参阅我的答案,以一种终端友好的方式在您的答案的“查找”部分中使用的命令。
bmike

1
您的答案将会在apple.stackexchange.com/questions/40243/…上找到但是;-)
bmike

4
对于相同的输出,sysctl hw.model比上面的命令要快。
Liyali 2014年

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

因此,您可以使用该方法(或在检查操作系统版本后,将其用于其他操作系统版本的其他类似技巧,如果您知道这些技巧,我不知道),并且如果该技巧不适用,则您始终可以使用该方法需要访问互联网。

这与“关于本机”显示的内容并不完全相同,在我的情况下为
MacBook Pro(Retina,13英寸,2015年初),
而其显示的是
带有Retina显示屏的13英寸MacBook Pro(2015年初),
但以人类可读的方式显示,我认为它已经足够接近了。


我意识到这个答案已有2年之久了,但是它已经对模型标识符进行了硬编码(第4行MacBookPro12,1),这意味着它始终声称您使用的是2015年初的13“ Mbps。–
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版本上使用。


这是在Catalina上实际为我工作的最简单方法。其他获得更多票数的答案需要访问互联网或返回模型标识符,这具有误导性。例如,“ MacBookPro15,1”对应于2018和2019 MBP。我将进一步简化它,仅需: 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)

为此,请参考上述几个答案。


1

Saaru的答案与Richard Hamilton的调试版本结合在一起,我得到以下信息,该代码可以在10.6至10.12(尽管10.6上的样本大小只是一台机器)上运行,并且可能更早/更高,并且不依赖于与互联网和苹果服务器没有变化

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中使用,因此必须手动将其重新添加到Shell -f测试中
  • -n标志sysctl意味着它打印只值,节省了我们一些sedawk工作

0

我们有一些2019 MBP 为tabrindle发布的两个单线返回不同年份的模型。

他的第一个班轮(使用sysctl -n hw.model)返回2019年的模型的2018年:

错误: 具有Thunderbolt 3和Touch ID的15英寸MacBook Pro(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

3
您列出的命令都没有执行问问者所要解决的问题。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.