集合了网上的Java读取系统硬件信息的可用代码,Windows上使用脚本去读取,linux上使用命令或者脚本读取,但linux中存在权限问题!
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.LookAndFeel;
import org.apache.log4j.Logger;
public class HardWareUtils {
private static Logger logger = Logger.getLogger(HardWareUtils.class);
private static String OSName =System.getProperty(“os.name”).toLowerCase();
public static List listResult = new ArrayList();
public HardWareUtils() {
logger.info(“——当前系统版本—–:”+OSName);
}
/**
* 获取当前操作系统名称
*/
public static String getOSName() {
return OSName;
}
// 主板序列号 windows
private static String getMainBordId_windows() {
String result = "";
try {
File file = File.createTempFile("realhowto", ".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
+ "Set colItems = objWMIService.ExecQuery _ \n" + " (\"Select * from Win32_BaseBoard\") \n"
+ "For Each objItem in colItems \n" + " Wscript.Echo objItem.SerialNumber \n"
+ " exit for ' do the first cpu only! \n" + "Next \n";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
} catch (Exception e) {
logger.error("获取主板信息错误", e);
}
return result.trim();
}
// 主板序列号 linux
private static String getMainBordId_linux() {
String result = "";
String maniBord_cmd = "dmidecode | grep 'Serial Number' | awk '{print $3}' | tail -1";
Process p;
try {
p = Runtime.getRuntime().exec(new String[] { "sh", "-c", maniBord_cmd });// 管道
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
result += line;
break;
}
br.close();
} catch (IOException e) {
logger.error("获取主板信息错误", e);
}
return result;
}
/**
* 获取mac地址 (如果Linux下有eth0这个网卡)
*/
private static String getMAC_linux() {
String mac = null;
BufferedReader bufferedReader = null;
Process process = null;
try {
// linux下的命令,一般取eth0作为本地主网卡
process = Runtime.getRuntime().exec("ifconfig eth0");
// 显示信息中包含有mac地址信息
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
int index = -1;
while ((line = bufferedReader.readLine()) != null) {
// 寻找标示字符串[hwaddr]
index = line.toLowerCase().indexOf("hwaddr");
if (index >= 0) {// 找到了
// 取出mac地址并去除2边空格
mac = line.substring(index + "hwaddr".length() + 1).trim();
break;
}
}
} catch (IOException e) {
logger.error("获取mac信息错误", e);
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e1) {
logger.error("获取mac信息错误", e1);
}
bufferedReader = null;
process = null;
}
return mac;
}
/**
* 获取Linux的mac
*/
private static String getMAC_linuxs() {
String mac = null;
BufferedReader bufferedReader = null;
Process process = null;
try {
// linux下的命令,一般取eth0作为本地主网卡
process = Runtime.getRuntime().exec("ifconfig");
// 显示信息中包含有mac地址信息
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
int index = -1;
while ((line = bufferedReader.readLine()) != null)
{
Pattern pat = Pattern.compile("\\b\\w+:\\w+:\\w+:\\w+:\\w+:\\w+\\b");
Matcher mat= pat.matcher(line);
if(mat.find())
{
mac=mat.group(0);
}
}
} catch (IOException e) {
logger.error("获取mac信息错误", e);
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e1) {
logger.error("获取mac信息错误", e1);
}
bufferedReader = null;
process = null;
}
return mac;
}
/**
* 获取widnows网卡的mac地址.
*/
private static String getMAC_windows() {
InetAddress ip = null;
NetworkInterface ni = null;
List<String> macList = new ArrayList<String>();
try {
Enumeration<NetworkInterface> netInterfaces = (Enumeration<NetworkInterface>) NetworkInterface
.getNetworkInterfaces();
while (netInterfaces.hasMoreElements()) {
ni = (NetworkInterface) netInterfaces.nextElement();
// ----------特定情况,可以考虑用ni.getName判断
// 遍历所有ip
Enumeration<InetAddress> ips = ni.getInetAddresses();
while (ips.hasMoreElements()) {
ip = (InetAddress) ips.nextElement();
if (!ip.isLoopbackAddress() // 非127.0.0.1
&& ip.getHostAddress().matches("(\\d{1,3}\\.){3}\\d{1,3}")) {
macList.add(getMacFromBytes(ni.getHardwareAddress()));
}
}
}
} catch (Exception e) {
logger.error("获取mac错误", e);
}
if (macList.size() > 0) {
return macList.get(0);
} else {
return "";
}
}
private static String getMacFromBytes(byte[] bytes) {
StringBuffer mac = new StringBuffer();
byte currentByte;
boolean first = false;
for (byte b : bytes) {
if (first) {
mac.append("-");
}
currentByte = (byte) ((b & 240) >> 4);
mac.append(Integer.toHexString(currentByte));
currentByte = (byte) (b & 15);
mac.append(Integer.toHexString(currentByte));
first = true;
}
return mac.toString().toUpperCase();
}
/**
* 获取CPU序列号 Windows
*
* @return
*/
private static String getCPUID_Windows() {
String result = "";
try {
File file = File.createTempFile("tmp", ".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
+ "Set colItems = objWMIService.ExecQuery _ \n" + " (\"Select * from Win32_Processor\") \n"
+ "For Each objItem in colItems \n" + " Wscript.Echo objItem.ProcessorId \n"
+ " exit for ' do the first cpu only! \n" + "Next \n";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
file.delete();
} catch (Exception e) {
logger.error("获取windows cpu信息错误", e);
}
return result.trim();
}
/**
* 获取CPU序列号 linux
*
* @return
*/
private static String getCPUID_linux() throws InterruptedException {
String result = "";
String CPU_ID_CMD = "dmidecode";
BufferedReader bufferedReader = null;
Process p = null;
try {
p = Runtime.getRuntime().exec(new String[] { "sh", "-c", CPU_ID_CMD });// 管道
bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
int index = -1;
while ((line = bufferedReader.readLine()) != null) {
// 寻找标示字符串[hwaddr]
index = line.toLowerCase().indexOf("uuid");
if (index >= 0) {// 找到了
// 取出mac地址并去除2边空格
result = line.substring(index + "uuid".length() + 1).trim();
break;
}
}
} catch (IOException e) {
logger.error("获取liunx cpu信息错误", e);
}
return result.trim();
}
/**
* 获取硬盘序列号(该方法获取的是 盘符的逻辑序列号,并不是硬盘本身的序列号)硬盘驱动器分区 如C,D
* 硬盘序列号还在研究中
* @param drive 盘符
* @return
*/
private static String getHardDiskSN_Windows(String drive) {
String result = "";
try {
File file = File.createTempFile("realhowto", ".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
+ "Set colDrives = objFSO.Drives\n"
+ "Set objDrive = colDrives.item(\""
+ drive
+ "\")\n"
+ "Wscript.Echo objDrive.SerialNumber"; // see note
fw.write(vbs);
fw.close();
String path = file.getPath().replace("%20", " ");
Process p = Runtime.getRuntime().exec(
"cscript //NoLogo " + path);
BufferedReader input = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
} catch (Exception e) {
e.printStackTrace();
}
return result.trim();
}
private static String getBiosSN_Windows() {
String result = "";
try {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("cmd.exe /c wmic bios get serialnumber");
InputStream in = p.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
return result.split("SerialNumber")[1].trim().toString();
}
/***************************linux下 通过执行shell读取 *********************************/
/**
* Java执行shell脚本入口
* @param shellName 脚本文件名
* @throws Exception
*/
public static void service(String shellName) throws Exception{
String shellDir = "";
String shellPath = "";
try {
//获取脚本所在的目录
String configFilePath = Thread.currentThread().getContextClassLoader().getResource("jdbc.properties").getPath();
File f = new File(configFilePath);
shellDir = f.getParent().split("java")[0];
logger.info("shell dir = " + shellDir);
//拼接完整的脚本目录
shellPath = shellDir + "java/solution/Shell/" + shellName;
logger.info("shell path = " + shellPath);
//执行脚本
callScript(shellPath);
} catch (Exception e) {
logger.error("ShellExcutor异常" + e.getMessage(), e);
throw e;
}
}
/**
* 脚本文件具体执行及脚本执行过程探测
* @param script 脚本文件绝对路径
* @throws Exception
*/
private static void callScript(String script) throws Exception{
try {
String cmd = "sh " + script;
try {
//解决脚本没有执行权限
ProcessBuilder builder = new ProcessBuilder("/bin/chmod", "755",script);
Process chmodprocess = builder.start();
int w=chmodprocess.waitFor();
if(w!=0)
{
logger.error("------callScript 开启脚本权限不成功!");
BufferedReader erro_br = new BufferedReader(new InputStreamReader(chmodprocess.getErrorStream()));;
String erroResult = "";
String l="";
while((l = erro_br.readLine()) != null){
erroResult+=l+"\n";
}
if(erroResult.length()>0)
logger.error("-----callScript erro"+erroResult);
erro_br.close();
}
chmodprocess.destroy();
} catch (Exception e) {
// TODO: handle exception
}
// //启动独立线程等待process执行完成
// CommandWaitForThread commandThread = new CommandWaitForThread(cmd);
// commandThread.start();
//
// while (!commandThread.isFinish()) {
// logger.info(“shell ” + script + ” 还未执行完毕,10s后重新探测”);
// Thread.sleep(10000);
// }
//
// //检查脚本执行结果状态码
// if(commandThread.getExitValue() != 0){
// throw new Exception(“shell ” + script + “执行失败,exitValue = ” + commandThread.getExitValue());
// }
// logger.info(“shell ” + script + “执行成功,exitValue = ” + commandThread.getExitValue());
logger.info(“——callScript cmd job : ” + cmd);
Scanner input = null;
Process process = null;
try {
//整个命令作为sh的参数进行执行,以便执行重定向和管道命令,否则管道命令会被当成参数执行,得到错误结果
//process = Runtime.getRuntime().exec(new String[] { “/bin/sh”, “-c”, cmd });
process = Runtime.getRuntime().exec(cmd);
try {
//等待命令执行完成
//process.waitFor(10, TimeUnit.SECONDS);
int waitfor = process.waitFor();
if(waitfor!=0)
{
logger.error(“——callScript 执行命令不成功!”);
BufferedReader erro_br = new BufferedReader(new InputStreamReader(process.getErrorStream()));;
String erroResult = “”;
String l=””;
while((l = erro_br.readLine()) != null){
erroResult+=l+”\n”;
}
if(erroResult.length()>0)
logger.error(“—–callScript erro”+erroResult);
erro_br.close();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
listResult.add(line);
}
br.close();
} finally {
if (input != null) {
input.close();
}
if (process != null) {
process.destroy();
}
}
}
catch (Exception e){
throw new Exception("执行脚本发生异常,脚本路径" + script, e);
}
}
/**
* 脚本函数执行线程
*/
private static class CommandWaitForThread extends Thread {
private String cmd;
private boolean finish = false;
private int exitValue = -1;
public CommandWaitForThread(String cmd) {
this.cmd = cmd;
}
public void run(){
try {
//执行脚本并等待脚本执行完成
Process process = Runtime.getRuntime().exec(cmd);
//写出脚本执行中的过程信息
BufferedReader infoInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader errorInput = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = "";
while ((line = infoInput.readLine()) != null) {
logger.info(line);
}
while ((line = errorInput.readLine()) != null) {
logger.error(line);
}
infoInput.close();
errorInput.close();
//阻塞执行线程直至脚本执行完成后返回
this.exitValue = process.waitFor();
} catch (Throwable e) {
logger.error("CommandWaitForThread accure exception,shell " + cmd, e);
exitValue = 110;
} finally {
finish = true;
}
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public int getExitValue() {
return exitValue;
}
}
/**
- 通过硬件名获取硬件信息
*/
private static String getInfoByName(String name) {
String infoString=””;
try {
if(listResult.size()==0)
service(“HardWareInfo.sh”);
for(String line:listResult)
{
if(line.contains(name))
{
String[] r= line.replace(name+”:”, “”).trim().split(“:”);
if(r.length>1)
{
if(r.length==2)
return r[1];
else {
//针对这种情况 00:16:3e:0a:6d:70
String rString=””;
for (int i = 0; i <r.length; i++) {
rString+=”:”+r[i];
}
return rString.split(“:”,2)[1];
}
}else return r[0]; }}} catch (Exception e) { // TODO: handle exception logger.error("------getInfoByName "+name+":"+e.getMessage(),e); throw new RuntimeException(); } return infoString;
}
/linux下 通过命令读取 / private static String executeLinuxCmd(String cmd) throws IOException {
logger.info(“——executeLinuxCmd got cmd job : ” + cmd);
Scanner input = null;
String result = “”;
Process process = null;
try {
//整个命令作为sh的参数进行执行,以便执行重定向和管道命令,否则管道命令会被当成参数执行,得到错误结果
process = Runtime.getRuntime().exec(new String[] { “/bin/sh”, “-c”, cmd });
try {
//等待命令执行完成
//process.waitFor(10, TimeUnit.SECONDS);
int waitfor = process.waitFor();
if(waitfor!=0)
logger.error(“——executeLinuxCmd 执行命令不成功!”);
} catch (InterruptedException e) {
e.printStackTrace();
}
// InputStream is = process.getInputStream();
// input = new Scanner(is);
// while (input.hasNextLine()) {
// result += input.nextLine() + “\n”;
// }
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
result += line;
break;
}
br = new BufferedReader(new InputStreamReader(process.getErrorStream()));;
String erroResult = “”;
while((line = br.readLine()) != null){
erroResult+=line+”\n”;
}
if(erroResult.length()>0)
logger.error(“—–executeLinuxCmd erro”+erroResult);
br.close();
//result = cmd + “\n” + result; //加上命令本身,打印出来
} finally {
if (input != null) {
input.close();
}
if (process != null) {
process.destroy();
}
}
return result; } /**- @param cmd 命令语句
/**- 获取CPU序列号
- @return
*/
public static String getCPUID() {
logger.info(“——当前系统版本—–:”+OSName);
try {
if (OSName!=null&&OSName.indexOf(“linux”)>-1) {//return getCPUID_linux2(); return getInfoByName("cpuid");
} else {
return getCPUID_Windows();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException();
}
- @return
/**- 获取主板序列号
- @return
*/
public static String getMainBordId() {
try {
if (OSName!=null&&OSName.indexOf(“linux”)>-1) {//return getMainBordId_linux2(); return getInfoByName("mainborid");
} else {
return getMainBordId_windows();
}
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error(“——getMainBordId——:”+e.getMessage());
throw new RuntimeException();
}
- @return
/**- linux 硬盘序列号
- @return
*/
public static String getHardDiskSN() {
try {
if (OSName!=null&&OSName.indexOf(“linux”)>-1) {//return getHardDiskSN_Linux(); return getInfoByName("harddisksn"); } else { return getHardDiskSN_Windows("C"); } } catch (Exception e) { // TODO Auto-generated catch block logger.error("------getHardDiskSN------:"+e.getMessage()); throw new RuntimeException(); }
/**- 获取bios列号
- @return
*/
public static String getBiosSN() {
try {
if (OSName!=null&&OSName.indexOf(“linux”)>-1) {//return getBiosVersion_Linux(); return getInfoByName("biossn"); } else {
return getBiosSN_Windows();
}
} catch (Exception e) {
logger.error(“——getBiosSN——:”+e.getMessage());
throw new RuntimeException();
}
}
- 获取widnows网卡的mac地址.
*/
public static String getMAC() {
try {
if (OSName!=null&&OSName.indexOf(“linux”)>-1) {//return getMAC_linuxs(); return getInfoByName("mac"); } else {
return getMAC_windows();
}
} catch (Exception e) {
logger.error(“——getMAC——:”+e.getMessage());
throw new RuntimeException();
}
}
}
转载自:https://blog.csdn.net/u011323200/article/details/104313700