Bagaimana saya dapat menemukan nomor seri di mac secara terprogram dari terminal?

37

Perintah apa yang dapat saya gunakan untuk mengambil nomor seri sistem dari baris perintah unix? Seperti yang unameakan menampilkan beberapa informasi tentang perangkat lunak dan perangkat keras, saya ingin mengambil nomor seri dari perintah untuk digunakan dalam skrip.

bmike
sumber

Jawaban:

55

The system_profiler perintah memberikan jawaban langsung yang mudah dibaca manusia (dengan asumsi Anda berada di 10.3 atau yang lebih baru), tetapi Anda juga dapat menggunakan ioreg untuk tugas seperti itu umumnya selesai lebih cepat.

system_profiler SPHardwareDataType adalah tipe data yang berisi informasi perangkat keras inti, dan Anda dapat menggunakan grep atau awk untuk menguraikan lebih lanjut sesuai kebutuhan:

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

atau

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

Kedua perintah tersebut memerlukan waktu antara 0,5 dan 0,2 detik untuk dijalankan pada SSD Mac modern, jadi jika Anda ingin mengoptimalkan perintah dan menghapus " Anda dapat memiliki jawaban Anda dalam 0,005 atau lebih:

ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
bmike
sumber
2
Yang ioreghampir instan di MBPR saya. system_profilermeskipun lebih cepat di mac ini daripada yang lebih tua saya jauh lebih lambat.
markhunte
system_profile sangat lambat, ioreg sangat cepat.
user1735921
14

Ini juga berfungsi ...

ioreg -l | grep IOPlatformSerialNumber
MrPool
sumber
Tentunya lebih mudah untuk mengetik daripada awkversi untuk menghapus 600 baris ioregoutput yang tidak ingin kita lihat. (juga - jangan pedulikan pemilih yang rendah - beberapa orang benar-benar tidak suka jawaban pendek atau lupa bahwa tidak semua orang tahu bagaimana grep dan awk bekerja.)
bmike
Ok, terima kasih bmike, sepertinya lebih mudah bagi saya, tetapi tidak mengharapkan suara turun untuk jawaban yang benar. Senang mendengarnya.
MrPool
1
@ MrPool ketika itu mengulangi apa yang ada di jawaban sebelumnya dan tidak membaik pada yang sebelumnya
user151019
1
Mereka tidak salah memilih. Bahkan suara turun bagus karena menunjukkan seseorang cukup peduli untuk mengambil tindakan. Juga, saya mencoba mengomentari atau memposting untuk ngobrol ketika saya melihat suara yang menurut saya tidak adil. Berita baiknya adalah suara naik adalah +10 dan turun hanya suara -2 jadi jika Anda memposting sesuatu yang kontroversial (seperti ini saldo nol dengan +2 dan -2 masih +16 rep.) Selamat datang di internet ;-)
bmike
1
Dan tanda sudah benar, jika semua yang dilakukan pengguna adalah posting secara eksklusif terlambat, pendek, perubahan kecil tanpa menjelaskan (jika saya kira poin Anda - mengetik grep lebih jelas, lebih pendek, dan cukup baik untuk banyak orang) saya mungkin melakukan ping ke pengguna itu dan bertanya mereka menjatuhkannya. Sebagian besar pengguna reputasi tinggi akan mengomentari jawaban saya, tetapi kami tidak dapat mengharapkan pengguna baru dengan 1 rep untuk melakukan itu, sekarang bisakah kita :-)
bmike
2

Untuk membuatnya lebih mudah diingat, gunakan pencarian case sensitive:

ioreg -l | grep -i serialnumber | grep -i platform
Jared
sumber
Peringatan: ini mengembalikan satu baris | "IOPlatformSerialNumber" = "YourSerialNumber" Tidak apa-apa secara visual, tetapi jika Anda menggunakannya dalam skrip, Anda harus mengubahnya agar awk.
jasonology
1

Contoh 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;
}
pengguna321228
sumber
Selamat Datang di Tanya Berbeda. Harap mengerti bahwa memposting jawaban yang pada dasarnya hanya berisi kode tanpa arah apa pun tentang apa yang harus dilakukan dengannya atau bagaimana menggunakannya tidak menghasilkan jawaban yang berkualitas. Silakan luangkan waktu untuk membaca Bagaimana cara menulis jawaban yang baik? dan kemudian edit jawaban Anda untuk memasukkan instruksi tentang cara menyusun kode dan bagaimana menggunakannya. Juga ikut Tur .
user3439894
Perlu dicatat bahwa ini diambil dari Apple Technical Docs, di mana ada penjelasan: developer.apple.com/library/archive/technotes/tn1103/…
Cinder Biscuits