linux下获取CPUID,MAC地址,硬盘序列号,主板序列号 您所在的位置:网站首页 小康社会年收入多少钱一个月 linux下获取CPUID,MAC地址,硬盘序列号,主板序列号

linux下获取CPUID,MAC地址,硬盘序列号,主板序列号

2024-03-08 16:26| 来源: 网络整理| 查看: 265

获取CPUID:

#include #include #include #include #include #include static bool get_cpu_id_by_asm(std::string & cpu_id) { cpu_id.clear(); unsigned int s1 = 0; unsigned int s2 = 0; asm volatile ( "movl $0x01, %%eax; \n\t" "xorl %%edx, %%edx; \n\t" "cpuid; \n\t" "movl %%edx, %0; \n\t" "movl %%eax, %1; \n\t" : "=m"(s1), "=m"(s2) ); if (0 == s1 && 0 == s2) { return(false); } char cpu[32] = { 0 }; snprintf(cpu, sizeof(cpu), "%08X%08X", htonl(s2), htonl(s1)); std::string(cpu).swap(cpu_id); return(true); } static void parse_cpu_id(const char * file_name, const char * match_words, std::string & cpu_id) { cpu_id.c_str(); std::ifstream ifs(file_name, std::ios::binary); if (!ifs.is_open()) { return; } char line[4096] = { 0 }; while (!ifs.eof()) { ifs.getline(line, sizeof(line)); if (!ifs.good()) { break; } const char * cpu = strstr(line, match_words); if (NULL == cpu) { continue; } cpu += strlen(match_words); while ('\0' != cpu[0]) { if (' ' != cpu[0]) { cpu_id.push_back(cpu[0]); } ++cpu; } if (!cpu_id.empty()) { break; } } ifs.close(); } static bool get_cpu_id_by_system(std::string & cpu_id) { cpu_id.c_str(); const char * dmidecode_result = ".dmidecode_result.txt"; char command[512] = { 0 }; snprintf(command, sizeof(command), "dmidecode -t 4 | grep ID > %s", dmidecode_result); if (0 == system(command)) { parse_cpu_id(dmidecode_result, "ID:", cpu_id); } unlink(dmidecode_result); return(!cpu_id.empty()); } static bool get_cpu_id(std::string & cpu_id) { if (get_cpu_id_by_asm(cpu_id)) { return(true); } if (0 == getuid()) { if (get_cpu_id_by_system(cpu_id)) { return(true); } } return(false); } static void test_1() { std::string cpu_id; if (get_cpu_id(cpu_id)) { printf("cpu_id: [%s]\n", cpu_id.c_str()); } else { printf("can not get cpu id\n"); } } static void test_2() { { std::string cpu_id; if (get_cpu_id_by_asm(cpu_id)) { printf("cpu_id_by_asm: [%s]\n", cpu_id.c_str()); } else { printf("can not get cpu id\n"); } } { std::string cpu_id; if (get_cpu_id_by_system(cpu_id)) { printf("cpu_id_by_sys: [%s]\n", cpu_id.c_str()); } else { printf("can not get cpu id\n"); } } } int main(int argc, char* argv[]) { test_1(); test_2(); return(0); }

获取MAC地址:(可以考虑加入ifconfig -a的解析,因为lshw实在太慢了)

#include #include #include #include #include #include #include #include #include #include bool get_mac_address_by_ioctl(std::string & mac_address) { mac_address.clear(); int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { return(false); } struct ifreq ifr = { 0 }; strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name) - 1); bool ret = (ioctl(sock, SIOCGIFHWADDR, &ifr) >= 0); close(sock); const char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; char mac[16] = { 0 }; for (int index = 0; index < 6; ++index) { size_t value = ifr.ifr_hwaddr.sa_data[index] & 0xFF; mac[2 * index + 0] = hex[value / 16]; mac[2 * index + 1] = hex[value % 16]; } std::string(mac).swap(mac_address); return(ret); } static void parse_mac_address(const char * file_name, const char * match_words, std::string & mac_address) { mac_address.c_str(); std::ifstream ifs(file_name, std::ios::binary); if (!ifs.is_open()) { return; } char line[4096] = { 0 }; while (!ifs.eof()) { ifs.getline(line, sizeof(line)); if (!ifs.good()) { break; } const char * mac = strstr(line, match_words); if (NULL == mac) { continue; } mac += strlen(match_words); while ('\0' != mac[0]) { if (' ' != mac[0] && ':' != mac[0]) { mac_address.push_back(mac[0]); } ++mac; } if (!mac_address.empty()) { break; } } ifs.close(); } static bool get_mac_address_by_system(std::string & mac_address) { mac_address.c_str(); const char * lshw_result = ".lshw_result.txt"; char command[512] = { 0 }; snprintf(command, sizeof(command), "lshw -c network | grep serial | head -n 1 > %s", lshw_result); if (0 == system(command)) { parse_mac_address(lshw_result, "serial:", mac_address); } unlink(lshw_result); return(!mac_address.empty()); } static bool get_mac_address(std::string & mac_address) { if (get_mac_address_by_ioctl(mac_address)) { return(true); } if (get_mac_address_by_system(mac_address)) { return(true); } return(false); } static void test_1() { std::string mac_address; if (get_mac_address(mac_address)) { printf("mac_address: [%s]\n", mac_address.c_str()); } else { printf("can not get mac address\n"); } } static void test_2() { { std::string mac_address; if (get_mac_address_by_ioctl(mac_address)) { printf("mac_address: [%s]\n", mac_address.c_str()); } else { printf("can not get mac address\n"); } } { std::string mac_address; if (get_mac_address_by_system(mac_address)) { printf("mac_address: [%s]\n", mac_address.c_str()); } else { printf("can not get mac address\n"); } } } int main(int argc, char * argv[]) { test_1(); test_2(); return(0); }

获取硬盘序列号:

#include #include #include #include #include #include #include #include #include #include static bool get_disk_name(std::string & disk_name) { disk_name.c_str(); std::ifstream ifs("/etc/mtab", std::ios::binary); if (!ifs.is_open()) { return(false); } char line[4096] = { 0 }; while (!ifs.eof()) { ifs.getline(line, sizeof(line)); if (!ifs.good()) { break; } const char * disk = line; while (isspace(disk[0])) { ++disk; } const char * space = strchr(disk, ' '); if (NULL == space) { continue; } const char * mount = space + 1; while (isspace(mount[0])) { ++mount; } if ('/' != mount[0] || ' ' != mount[1]) { continue; } while (space > disk && isdigit(space[-1])) { --space; } if (space > disk) { std::string(disk, space).swap(disk_name); break; } } ifs.close(); return(!disk_name.empty()); } static void trim_serial(const void * serial, size_t serial_len, std::string & serial_no) { const char * serial_s = static_cast(serial); const char * serial_e = serial_s + serial_len; while (serial_s < serial_e) { if (isspace(serial_s[0])) { ++serial_s; } else if ('\0' == serial_e[-1] || isspace(serial_e[-1])) { --serial_e; } else { break; } } if (serial_s < serial_e) { std::string(serial_s, serial_e).swap(serial_no); } } static bool get_disk_serial_by_way_1(const std::string & disk_name, std::string & serial_no) { serial_no.clear(); int fd = open(disk_name.c_str(), O_RDONLY); if (-1 == fd) { return(false); } struct hd_driveid drive = { 0 }; if (0 == ioctl(fd, HDIO_GET_IDENTITY, &drive)) { trim_serial(drive.serial_no, sizeof(drive.serial_no), serial_no); } close(fd); return(!serial_no.empty()); } static bool scsi_io( int fd, unsigned char * cdb, unsigned char cdb_size, int xfer_dir, unsigned char * data, unsigned int data_size, unsigned char * sense, unsigned int sense_len ) { sg_io_hdr_t io_hdr = { 0 }; io_hdr.interface_id = 'S'; io_hdr.cmdp = cdb; io_hdr.cmd_len = cdb_size; io_hdr.sbp = sense; io_hdr.mx_sb_len = sense_len; io_hdr.dxfer_direction = xfer_dir; io_hdr.dxferp = data; io_hdr.dxfer_len = data_size; io_hdr.timeout = 5000; if (ioctl(fd, SG_IO, &io_hdr) < 0) { return(false); } if (SG_INFO_OK != (io_hdr.info & SG_INFO_OK_MASK) && io_hdr.sb_len_wr > 0) { return(false); } if (io_hdr.masked_status || io_hdr.host_status || io_hdr.driver_status) { return(false); } return(true); } static bool get_disk_serial_by_way_2(const std::string & disk_name, std::string & serial_no) { serial_no.clear(); int fd = open(disk_name.c_str(), O_RDONLY); if (-1 == fd) { return(false); } int version = 0; if (ioctl(fd, SG_GET_VERSION_NUM, &version) < 0 || version < 30000) { close(fd); return(false); } const unsigned int data_size = 0x00ff; unsigned char data[data_size] = { 0 }; const unsigned int sense_len = 32; unsigned char sense[sense_len] = { 0 }; unsigned char cdb[] = { 0x12, 0x01, 0x80, 0x00, 0x00, 0x00 }; cdb[3] = (data_size >> 8) & 0xff; cdb[4] = (data_size & 0xff); if (scsi_io(fd, cdb, sizeof(cdb), SG_DXFER_FROM_DEV, data, data_size, sense, sense_len)) { int page_len = data[3]; trim_serial(data + 4, page_len, serial_no); } close(fd); return(!serial_no.empty()); } static bool parse_serial(const char * line, int line_size, const char * match_words, std::string & serial_no) { const char * serial_s = strstr(line, match_words); if (NULL == serial_s) { return(false); } serial_s += strlen(match_words); while (isspace(serial_s[0])) { ++serial_s; } const char * serial_e = line + line_size; const char * comma = strchr(serial_s, ','); if (NULL != comma) { serial_e = comma; } while (serial_e > serial_s && isspace(serial_e[-1])) { --serial_e; } if (serial_e


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有