需求:希望项目和服务器硬件绑定,自购硬件服务器,非云上虚拟服务器。
所以获取服务器硬件序列号,做加密运算后得到验证字符串,现记录Java使用Bash获取Linux硬件序列号代码。
1.获取Linux硬件信息命令行使用 dmidecode 命令获取服务器详细硬件信息,因为我们需要获取到硬件序列号信息,所以使用dmidecode | grep 'Serial Number' 过滤得到序列号信息,如下图所示。
2、使用Java调用Bash命令,得到上图信息创建 LinuxInfoCollect.java 文件,内部代码如下
private static String exec(String cmd) {try {String[] cmdA = { "/bin/sh", "-c", cmd };Process process = Runtime.getRuntime().exec(cmdA);LineNumberReader br = new LineNumberReader(new InputStreamReader(process.getInputStream()));StringBuffer sb = new StringBuffer();String line;while ((line = br.readLine()) != null) {System.out.println(line);line = line.trim();sb.append(line).append("n");}return sb.toString();} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) {String netsString = exec("dmidecode | grep 'Serial Number'");System.out.println("==========获得值=============");System.out.println(netsString);}
在服务器上运行,得到下图结果:
已经得到硬件序列号信息。
3.格式化序列号信息从图中可以看到,有部分序列号是空串或者是"Not Specified"字串,我们需要根据自己的需求,做字符串的处理即可。我的处理流程为,剔除空串以及"Not Specified"字串,然后使用Collections.sort(serialNumbers)默认排序规则,做序列号的排序,得到最终值。
4.不同类型服务器的情况[/BCC02L3/CNFCW001BP00C3/, 17E30442, BCC02L3, BCC02L3]
经测试
实体服务器上运行正常,可以得到硬件序列号;
在阿里云ECS上运行,仅能得到一个字符串,为 System Information 下序列号,其他硬件信息均无法得到。
在移动云ECS上运行,无法得到任何序列号。
如果有其他服务器测试结果,在评论区指出。