linux下获取CPUID,MAC地址,硬盘序列号,主板序列号
来源:互联网 发布:网络优化需要培训费吗 编辑:程序博客网 时间:2024/05/22 13:11
获取CPUID:
#include <cstdio>#include <cstring>#include <cstdlib>#include <arpa/inet.h>#include <string>#include <fstream>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 <cstdio>#include <cstring>#include <cstdlib>#include <unistd.h>#include <net/if.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <string>#include <fstream>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 <cctype>#include <cstdlib>#include <cstring>#include <fcntl.h>#include <unistd.h>#include <scsi/sg.h>#include <sys/ioctl.h>#include <linux/hdreg.h>#include <string>#include <fstream>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<const char *>(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 <= serial_s) { return(false); } std::string(serial_s, serial_e).swap(serial_no); return(true);}static void get_serial(const char * file_name, const char * match_words, std::string & serial_no){ serial_no.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; } if (0 == ifs.gcount()) { continue; } if (parse_serial(line, ifs.gcount() - 1, match_words, serial_no)) { break; } } ifs.close();}static bool get_disk_serial_by_way_3(const std::string & disk_name, std::string & serial_no){ serial_no.c_str(); const char * hdparm_result = ".hdparm_result.txt"; char command[512] = { 0 }; snprintf(command, sizeof(command), "hdparm -i %s | grep SerialNo > %s", disk_name.c_str(), hdparm_result); if (0 == system(command)) { get_serial(hdparm_result, "SerialNo=", serial_no); } unlink(hdparm_result); return(!serial_no.empty());}static bool get_disk_serial_by_way_4(std::string & serial_no){ serial_no.c_str(); const char * lshw_result = ".lshw_result.txt"; char command[512] = { 0 }; snprintf(command, sizeof(command), "lshw -class disk | grep serial > %s", lshw_result); if (0 == system(command)) { get_serial(lshw_result, "serial:", serial_no); } unlink(lshw_result); return(!serial_no.empty());}static bool get_disk_serial_number(std::string & serial_no){ if (0 != getuid()) { return(false); } std::string disk_name; if (get_disk_name(disk_name)) { if (get_disk_serial_by_way_1(disk_name, serial_no)) { return(true); } if (get_disk_serial_by_way_2(disk_name, serial_no)) { return(true); } if (get_disk_serial_by_way_3(disk_name, serial_no)) { return(true); } } if (get_disk_serial_by_way_4(serial_no)) { return(true); } return(false);}static void test_1(){ std::string serial_no; if (get_disk_serial_number(serial_no)) { printf("serial_number: [%s]\n", serial_no.c_str()); } else { printf("get serial number failed\n"); }}static void test_2(){ std::string disk_name; if (get_disk_name(disk_name)) { printf("disk_name:[%s]\n", disk_name.c_str()); { std::string serial_no; get_disk_serial_by_way_1(disk_name, serial_no); printf("get_serial_by_way_1:[%s]\n", serial_no.c_str()); } { std::string serial_no; get_disk_serial_by_way_2(disk_name, serial_no); printf("get_serial_by_way_2:[%s]\n", serial_no.c_str()); } { std::string serial_no; get_disk_serial_by_way_3(disk_name, serial_no); printf("get_serial_by_way_3:[%s]\n", serial_no.c_str()); } } { std::string serial_no; get_disk_serial_by_way_4(serial_no); printf("get_serial_by_way_4:[%s]\n", serial_no.c_str()); }}int main(int argc, char * argv[]){ printf("---------------\n"); test_1(); printf("---------------\n"); test_2(); printf("---------------\n"); return(0);}
获取主板序列号:(没有找到纯代码的实现方法)
#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <fstream>static void parse_board_serial(const char * file_name, const char * match_words, std::string & board_serial){ board_serial.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 * board = strstr(line, match_words); if (NULL == board) { continue; } board += strlen(match_words); while ('\0' != board[0]) { if (' ' != board[0]) { board_serial.push_back(board[0]); } ++board; } if ("None" == board_serial) { board_serial.clear(); continue; } if (!board_serial.empty()) { break; } } ifs.close();}static bool get_board_serial_by_system(std::string & board_serial){ board_serial.c_str(); const char * dmidecode_result = ".dmidecode_result.txt"; char command[512] = { 0 }; snprintf(command, sizeof(command), "dmidecode -t 2 | grep Serial > %s", dmidecode_result); if (0 == system(command)) { parse_board_serial(dmidecode_result, "Serial Number:", board_serial); } unlink(dmidecode_result); return(!board_serial.empty());}static bool get_board_serial_number(std::string & board_serial){ if (0 == getuid()) { if (get_board_serial_by_system(board_serial)) { return(true); } } return(false);}static void test(){ std::string board_serial; if (get_board_serial_number(board_serial)) { printf("board_serial: [%s]\n", board_serial.c_str()); } else { printf("can not get board id\n"); }}int main(int argc, char* argv[]){ test(); return(0);}
方便测试的Makefile:
build :g++ -o get_cpu_id get_cpu_id.cppg++ -o get_mac_address get_mac_address.cppg++ -o get_disk_serial_number get_disk_serial_number.cppg++ -o get_board_serial_number get_board_serial_number.cpprun :@echo "--------------------"@- ./get_cpu_id@echo "--------------------"@- ./get_mac_address@echo "--------------------"@- ./get_disk_serial_number@echo "--------------------"@- ./get_board_serial_number@echo "--------------------"clean : -rm get_cpu_id-rm get_mac_address-rm get_disk_serial_number-rm get_board_serial_numberrebuild : clean build
编译:make 或者 make build
运行:make run 或者 sudo make run (上面大多数信息都需要超级用户权限才能获取到结果)
清理:make clean (这个写得太死了,本来是想删除非cpp文件的,shell写不出来)
重编:make rebuild
参考网站:http://www.xuebuyuan.com/1789815.html
0 0
- linux下获取CPUID,MAC地址,硬盘序列号,主板序列号
- linux下获取CPUID,MAC地址,硬盘序列号,主板序列号
- Linux下获取CPUID、硬盘序列号与MAC地址
- Linux下获取CPUID、硬盘序列号与MAC地址
- Linux下获取CPUID、硬盘序列号与MAC地址
- java获取CPUID、网卡MAC、硬盘序列号、主板序列号
- 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
- 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
- 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
- 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
- 获取计算机的信息(IP地址、MAC地址、CUP序列号、硬盘序列号、主板信息等等)
- 用脚本获取网卡MAC,CPUID,硬盘序列号(转)
- 用vbs脚本获取网卡MAC,CPUID,硬盘序列号
- 如何获取硬盘序列号与主板序列号
- 基于硬件指纹的软件加密和注册技术--获取硬盘物理序列号、CPU序列号、网卡MAC地址、BIOS序列号、主板序列号
- 基于硬件指纹的软件加密和注册技术--获取硬盘物理序列号、CPU序列号、网卡MAC地址、BIOS序列号、主板序列号
- C#获取硬盘序列号,CPU序列号,网卡MAC地址
- 用C#获取硬盘序列号,CPU序列号,网卡MAC地址
- HDU 5607 矩阵快速幂
- B站的DanmakuFlameMaster的使用
- 读完这个我懂了JNDI
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast
- Android卡片式列表布局
- linux下获取CPUID,MAC地址,硬盘序列号,主板序列号
- 导出数据到Excel表(不需要本地安装Office)
- 移动端:active伪类无效的解决方法
- android 一些总结 1.2-1.10
- Echars在bootstrap的tab下切换不能正常显示的问题
- iOS开发实践之多线程(GCD)
- android studio在编辑时出现如Failed to sync Gradle project类似的问题时的解决方案
- PyQt5系列教程(六)如何让界面和逻辑分离
- three.js学习笔记 相机控件