java获取linux和window序列号

这篇具有很好参考价值的文章主要介绍了java获取linux和window序列号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

获取系统序列号在Java中并不是一个直接支持的功能,因为Java语言本身并不提供直接访问硬件级别的信息,如CPU序列号。但是,我们可以使用一些平台特定的工具或命令来实现这一功能。下面我将展示如何使用Java获取Windows和Linux系统上的CPU序列号、磁盘、mac地址等信息,及使用Runtime.getRuntime().exec执行linux命令没反应问题解决。

代码

需要确保你的系统上安装了wmic工具。

/**
 * 获取cpu序列号
 *
 * @return 序列号
 */
public static String getCPUSerialNumber() {
    String sysName = System.getProperty("os.name");
    if (sysName.contains("Windows")) {//win
        String str = runCmd("wmic cpu get ProcessorId", 3);
        return str;
    } else if (sysName.contains("Linux")) {
        String str = runCmd("dmidecode |grep -A16 \"Processor Information$\"", "ID");
        if (str != null) {
            return str.substring(str.indexOf(":")).trim();
        }
    } else if (sysName.contains("Mac")) {
        String str = runCmd("system_profiler SPHardwareDataType", "Serial Number");
        if (str != null) {
            return str.substring(str.indexOf(":") + 1).trim();
        }
    }
    return "";
}

/**
 * 获取硬盘序列号
 *
 * @return 硬盘序列号
 */
public static String getHardDiskSerialNumber() {
    String sysName = System.getProperty("os.name");
    if (sysName.contains("Windows")) {//win
        String str = runCmd("wmic path win32_physicalmedia get serialnumber", 3);
        return str;
    } else if (sysName.contains("Linux")) {
        String str = runCmd("dmidecode |grep -A16 \"System Information$\"", "Serial Number");
        if (str != null) {
            return str.substring(str.indexOf(":")).trim();
        }
    } else if (sysName.contains("Mac")) {
        String str = runCmd("system_profiler SPStorageDataType", "Volume UUID");
        if (str != null) {
            return str.substring(str.indexOf(":") + 1).trim();
        }
    }
    return "";
}

/**
 * 运行命令
 *
 * @param cmd  命令
 * @param line 返回第几行结果,0返回所有
 * @return 结果
 */
public static String runCmd(String cmd, int line) {
    Process process;
    Scanner sc = null;
    StringBuffer sb = new StringBuffer();
    try {
        process = Runtime.getRuntime().exec(cmd);
        process.getOutputStream().close();
        sc = new Scanner(process.getInputStream());
        int i = 0;
        while (sc.hasNextLine()) {
            i++;
            String str = sc.nextLine();
            if (line <= 0) {
                sb.append(str).append("\r\n");
            } else if (i == line) {
                return str.trim();
            }
        }
        sc.close();
    } catch (Exception e) {


    } finally {
        IoUtils.close(sc);
    }
    return sb.toString();
}

/**
 * 运行cmd命令
 *
 * @param cmd    命令
 * @param substr 关键字
 * @return 包含关键字的行数
 */
public static String runCmd(String cmd, String substr) {
    Process process;
    Scanner sc = null;
    try {
        //ProcessBuilder 类提供了一种更灵活的方式来构建和执行外部进程。与 Runtime.exec() 相比,ProcessBuilder 允许你更细致地控制进程的执行环境。
//            ProcessBuilder pb = new ProcessBuilder(new String[]{"/bin/sh", "-c", cmd});
//            process = pb.start();
        //Runtime.getRuntime().exec(String cmd) 方法在 Java 中用于执行外部命令。
        process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});
//            process = Runtime.getRuntime().exec(cmd);
        process.getOutputStream().close();
        sc = new Scanner(process.getInputStream());
        while (sc.hasNextLine()) {
            String str = sc.nextLine();
            if (str != null && str.contains(substr)) {
                return str.trim();
            }
        }
        sc.close();
    } catch (Exception e) {

    } finally {
        IoUtils.close(sc);
    }
    return null;
}

/**
 * 获取mac地址
 *
 * @return mac 列表
 */
public static List<String> getMacList() {
    ArrayList<String> list = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    try {
        java.util.Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
        while (en.hasMoreElements()) {
            NetworkInterface iface = en.nextElement();
            List<InterfaceAddress> addrs = iface.getInterfaceAddresses();
            for (InterfaceAddress addr : addrs) {
                InetAddress ip = addr.getAddress();
                if (ip.isLinkLocalAddress()) {//本地的不要
                    continue;
                }
                NetworkInterface network = NetworkInterface.getByInetAddress(ip);
                if (network == null) {
                    continue;
                }
                byte[] mac = network.getHardwareAddress();
                if (mac == null) {
                    continue;
                }

                sb.delete(0, sb.length());
                for (int i = 0; i < mac.length; i++) {
                    sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
                }
                if (!list.contains(sb.toString())) {
                    list.add(sb.toString());
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return list;
}

问题

process = Runtime.getRuntime().exec(cmd);

使用 Runtime.getRuntime().exec(String cmd) 时,Java 会尝试使用系统的默认 shell(例如 bash、sh、cmd 等)来执行该命令。因此,你可能会遇到一些与 shell 的语法和解析有关的问题,特别是在处理空格、管道符等特殊字符时。

解决

方法一:ProcessBuilder 是一个更现代和灵活的方法,用于构建和执行外部进程。它提供了更多的控制选项,可以更好地处理参数和特殊字符。

ProcessBuilder pb = new ProcessBuilder("yourCommand", "arg1", "arg2");  
Process p = pb.start();

方法二:将命令字符串分解为字符串数组,并将它们传递给 exec 方法。这样可以确保每个参数都被正确处理,而不会被视为命令的一部分。

process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});

-c表示cmd是一条命令,从而不会被截断

java获取linux和window序列号,与程序二三事,java,linux,开发语言文章来源地址https://www.toymoban.com/news/detail-820652.html

白雪却嫌春色晚,故穿庭树作飞花

到了这里,关于java获取linux和window序列号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 12.0默认授予app获取序列号SerialNo权限

    在12.0的系统rom定制化中,在一些第三方app开发中,会获取序列号等属性,而在10.0以后的高版本对于获取系统属性的相关信息要求严格 必须有权限才可以,10.0以前的Android版本中,可以直接通过调用Build.SERIAL来获取序列号,在高版本中,为了保护个人隐私, 不让第三方应用轻

    2024年02月07日
    浏览(97)
  • Linux:TCP 序列号简介

    限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 TCP 序列号 ,是为 TCP 协议通信数据中的每一个字节赋予一个唯一编号,其作用可以概括如下: 一图胜千言,还是上一张图来直观感受下: 上图是 TCP 协议数据头部,红框中的部分: 序号

    2024年02月02日
    浏览(62)
  • 用python读取硬盘序列号 CPU序列号 主板序列号 bios序列号

    磁盘的序列号对于一些应用程序来说是非常重要的。本文将介绍Python如何获取磁盘序列号。Python通过os模块来获取磁盘序列号,具体实现方法如下: import wmi c = wmi.WMI() # # 硬盘序列号 for physical_disk in c.Win32_DiskDrive():     print(\\\"硬盘序列号\\\", physical_disk.SerialNumber) # CPU序列号 for

    2024年01月18日
    浏览(65)
  • 如何查询iPhone手机的序列号?苹果序列号查询方法

    iPhone序列号不仅可以查询设备的基本信息,包括生产日期、生产厂家、颜色、内存大小、版本等; 还可以用来验证设备真伪、查询激活日期、保修情况、是否开启查找我的功能等。 那么,如何查询iPhone手机的序列号呢?今天小编就给大家介绍怎么查询苹果序列号,有需要的

    2024年02月05日
    浏览(69)
  • OllyDbg 使用 快捷键 界面 实战:修改数据 修改代码 获取正确序列号,重要数据等 跳过关键验证 改试用期 解锁限制的功能 安防安全行业基础

    1、按住F8直到 找到位置 (弹出一个MessageBox窗口) 2、再次,进入到位置里, 找到要改的值 3、修改值(根据数据地址,到数据面板 按下Ctrl+G 输入 地址 鼠标选中要改的地方,按下空格键输入要改动字符。) 4、永久保存(选中改过的部分–右键选择复制到可执行程序–备份

    2024年02月21日
    浏览(44)
  • 序列号及序列号生成器(号段模式,数据库模式)详细介绍(建议收藏)

    现如今,数据的唯一性和可追溯性变得越来越重要。从简单的数据库主键到复杂的分布式系统,唯一标识符在各种场景中都发挥着关键作用。序列号,作为一种广泛应用的唯一标识符,为我们提供了确保数据完整性和一致性的基础。在这个背景下,高效、可靠的序列号生成器

    2024年02月03日
    浏览(74)
  • linux dmidecode命令(dmidecode指令)DMI (Desktop Management Interface) 数据、桌面管理接口数据、查看系统信息、查看硬件信息、设备序列号

    dmidecode 是一个在 Linux 系统下获取硬件信息的工具。它允许用户查看计算机硬件的详细信息,包括制造商、产品名称、序列号等。这个命令能够解析和显示计算机的 DMI (Desktop Management Interface) 数据。 在大多数 Linux 发行版中, dmidecode 都是预装的。如果没有预装,可以使用系统

    2024年04月11日
    浏览(46)
  • 显示器序列号查询方式

    序列号位置 :位于显示器背部下方凹槽内 显示 S/N 或 序号 字段,可参考本文最下方图片 方式一:人工输入 方式二:微信提取文字,步骤如下 序列号拍照发送到自己微信长按图片提取文字(iPhone有概率没有这个选项,没有的话重拍只包含S/N的清晰照片或用安卓版微信尝试或

    2024年02月11日
    浏览(59)
  • 查找mac硬盘序列号的方法

    需要查找macbook pro的硬盘序列号信息,找了好几个帖子,发现都不见效,需要花费时间找的东西都有必要记录下来,防止下次重复浪费时间。 macbook pro macos版本: 根据百度提供的方法,并不能得到相应的效果,原因如下: 不知道是不是最新更新了mac os系统的原因,找不到系统

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包