如何从终端上以编程方式在Mac上找到序列号?


37

我可以使用什么命令从UNIX命令行检索系统的序列号?如uname将输出有关软件和硬件的信息一样,我想从命令中检索序列号以在脚本中使用。

Answers:


55

system_profiler命令提供了一个直接的答案那是很容易人类可读的(假设你是在10.3或更高版本),但你也可以使用名为ioreg的任务,因为它通常完成得更快。

system_profiler SPHardwareDataType 是包含核心硬件信息的数据类型,您可以根据需要使用grep或awk进一步简化操作:

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

要么

ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'

这两个命令在现代SSD Mac上运行都需要0.5到0.2秒,因此,如果您要优化命令删除“,则可以在0.005秒左右的时间内得到答案:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'

2
ioreg一个靠近我的MBPR瞬间。system_profiler尽管在这台Mac上速度比我的旧Mac快得多。
markhunte

system_profile非常慢,ioreg非常快。
user1735921

14

这也可以...

ioreg -l | grep IOPlatformSerialNumber

当然,键入要比不希望看到awk的600行ioreg输出更容易。(另外-不要介意沮丧的选民-有些人真的不喜欢简短的答案,或者忘记了不是每个人都知道grep和awk的工作方式。)
bmike

好的,谢谢bmike,对我来说似乎更简单,但没想到要获得正确答案的否决。很高兴知道。
MrPool 2014年

1
@MrPool在重复前一个答案中的内容时不会重复,并且在上一个答案中没有改善
user151019 2014年

1
他们本身并不是错误的选票。即使否决票也不错,因为它们表明有人足够在意采取行动。另外,当我发现总的投票结果令我不满意时,我会尝试发表评论或发表聊天。好消息是,赞成票只有+10,反对票只有-2,因此,如果您发布有争议的内容(例如+2和-2的零余额仍为+16代表),欢迎访问互联网;-)
bmike

1
标记是正确的,如果所有用户所做的只是排他性地发布,简短,微小的更改而没有解释(如果我猜对了,如果输入grep更加清晰,简短,并且对许多人都足够好),我可以ping通该用户并询问他们把它关了。大多数享有较高声誉的用户都会评论我的答案,但是我们不能指望一个拥有1名代表的新用户这样做,现在我们可以:-)
bmike

2

为了便于记忆,请使用不区分大小写的搜索:

ioreg -l | grep -i serialnumber | grep -i platform

警告:这将返回一行| “ IOPlatformSerialNumber” =“ YourSerialNumber”这在视觉上很好,但是如果在脚本中使用它,则需要将其通过管道传输到awk。
jasonology

1

C ++示例:

#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>

std::string 

getSerialNumber()

{

   CFStringRef serial;
    char buffer[32] = {0};
    std::string seriaNumber;

io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
                                                          IOServiceMatching("IOPlatformExpertDevice"));
if (platformExpert)
{
    CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,
                                                                       CFSTR(kIOPlatformSerialNumberKey),
                                                                       kCFAllocatorDefault, 0);
    if (serialNumberAsCFString) {
        serial = (CFStringRef)serialNumberAsCFString;
    }
    if (CFStringGetCString(serial, buffer, 32, kCFStringEncodingUTF8)) {
        seriaNumber = buffer;
    }

    IOObjectRelease(platformExpert);
}
return seriaNumber;
}

欢迎问不同。请理解,发布答案本质上仅包含无任何指导的代码,说明如何使用它或如何使用它并不能构成高质量的答案。请花时间阅读如何写一个好的答案?然后编辑您的答案以包括有关编译代码以及如何使用代码的说明。也参加游览
user3439894

值得注意的是,这是从苹果的技术文件,其中一个解释存在采取:developer.apple.com/library/archive/technotes/tn1103/...
煤渣饼干
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.