最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Java獲取linux和window序列號(hào)

 更新時(shí)間:2024年01月24日 15:45:30   作者:三省同學(xué)  
這篇文章主要為大家詳細(xì)介紹了如何使用Java獲取Windows和Linux系統(tǒng)上的CPU序列號(hào)、磁盤、mac地址等信息,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

獲取系統(tǒng)序列號(hào)在Java中并不是一個(gè)直接支持的功能,因?yàn)镴ava語言本身并不提供直接訪問硬件級(jí)別的信息,如CPU序列號(hào)。但是,我們可以使用一些平臺(tái)特定的工具或命令來實(shí)現(xiàn)這一功能。下面我將展示如何使用Java獲取Windows和Linux系統(tǒng)上的CPU序列號(hào)、磁盤、mac地址等信息,及使用Runtime.getRuntime().exec執(zhí)行l(wèi)inux命令沒反應(yīng)問題解決。

代碼

需要確保你的系統(tǒng)上安裝了wmic工具。

/**
 * 獲取cpu序列號(hào)
 *
 * @return 序列號(hào)
 */
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 "";
}

/**
 * 獲取硬盤序列號(hào)
 *
 * @return 硬盤序列號(hào)
 */
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 "";
}

/**
 * 運(yùn)行命令
 *
 * @param cmd  命令
 * @param line 返回第幾行結(jié)果,0返回所有
 * @return 結(jié)果
 */
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();
}

/**
 * 運(yùn)行cmd命令
 *
 * @param cmd    命令
 * @param substr 關(guān)鍵字
 * @return 包含關(guān)鍵字的行數(shù)
 */
public static String runCmd(String cmd, String substr) {
    Process process;
    Scanner sc = null;
    try {
        //ProcessBuilder 類提供了一種更靈活的方式來構(gòu)建和執(zhí)行外部進(jìn)程。與 Runtime.exec() 相比,ProcessBuilder 允許你更細(xì)致地控制進(jìn)程的執(zhí)行環(huán)境。
//            ProcessBuilder pb = new ProcessBuilder(new String[]{"/bin/sh", "-c", cmd});
//            process = pb.start();
        //Runtime.getRuntime().exec(String cmd) 方法在 Java 中用于執(zhí)行外部命令。
        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) 時(shí),Java 會(huì)嘗試使用系統(tǒng)的默認(rèn) shell(例如 bash、sh、cmd 等)來執(zhí)行該命令。因此,你可能會(huì)遇到一些與 shell 的語法和解析有關(guān)的問題,特別是在處理空格、管道符等特殊字符時(shí)。

解決

方法一:ProcessBuilder 是一個(gè)更現(xiàn)代和靈活的方法,用于構(gòu)建和執(zhí)行外部進(jìn)程。它提供了更多的控制選項(xiàng),可以更好地處理參數(shù)和特殊字符。

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

方法二:將命令字符串分解為字符串?dāng)?shù)組,并將它們傳遞給 exec 方法。這樣可以確保每個(gè)參數(shù)都被正確處理,而不會(huì)被視為命令的一部分。

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

-c表示cmd是一條命令,從而不會(huì)被截?cái)?/p>

到此這篇關(guān)于使用Java獲取linux和window序列號(hào)的文章就介紹到這了,更多相關(guān)Java獲取序列號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • RedisTemplate和Redisson的區(qū)別

    RedisTemplate和Redisson的區(qū)別

    本文主要介紹了RedisTemplate和Redisson的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • 使用Nexus搭建Maven私服的方法步驟

    使用Nexus搭建Maven私服的方法步驟

    這篇文章主要介紹了使用Nexus搭建Maven私服的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • nacos配置文件優(yōu)先級(jí)過程

    nacos配置文件優(yōu)先級(jí)過程

    這篇文章主要介紹了nacos配置文件優(yōu)先級(jí)過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringBoot整合模板引擎過程代碼實(shí)例

    SpringBoot整合模板引擎過程代碼實(shí)例

    這篇文章主要介紹了SpringBoot整合模板引擎過程代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java中多媒體文件上傳及頁面回顯的操作代碼

    Java中多媒體文件上傳及頁面回顯的操作代碼

    這篇文章主要介紹了Java中多媒體文件上傳及頁面回顯的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • redis實(shí)現(xiàn)隊(duì)列的阻塞、延時(shí)、發(fā)布和訂閱

    redis實(shí)現(xiàn)隊(duì)列的阻塞、延時(shí)、發(fā)布和訂閱

    本文主要介紹了redis實(shí)現(xiàn)隊(duì)列的阻塞、延時(shí)、發(fā)布和訂閱,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • MyBatis 源碼分析 之SqlSession接口和Executor類

    MyBatis 源碼分析 之SqlSession接口和Executor類

    mybatis框架在操作數(shù)據(jù)的時(shí)候,離不開SqlSession接口實(shí)例類的作用,下面通過本文給大家實(shí)例剖析MyBatis 源碼分析之SqlSession接口和Executor類,需要的朋友參考下吧
    2017-02-02
  • Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)查詢的兩種方法

    Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)查詢的兩種方法

    本篇文章主要介紹了Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)查詢的兩種方法,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-04-04
  • Java設(shè)計(jì)模式之責(zé)任鏈模式的示例詳解

    Java設(shè)計(jì)模式之責(zé)任鏈模式的示例詳解

    責(zé)任鏈模式是將鏈中的每一個(gè)節(jié)點(diǎn)看做是一個(gè)對(duì)象,每個(gè)節(jié)點(diǎn)處理的請(qǐng)求均不相同,且內(nèi)部自動(dòng)維護(hù)下一個(gè)節(jié)點(diǎn)對(duì)象,當(dāng)一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥伟l(fā)出時(shí),會(huì)沿著鏈的路徑依次傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象。本文將通過示例和大家詳細(xì)聊聊責(zé)任鏈模式,需要的可以參考一下
    2022-11-11
  • SpringMVC結(jié)合ajaxfileupload實(shí)現(xiàn)文件無刷新上傳代碼

    SpringMVC結(jié)合ajaxfileupload實(shí)現(xiàn)文件無刷新上傳代碼

    本篇文章主要介紹了SpringMVC結(jié)合ajaxfileupload實(shí)現(xiàn)文件無刷新上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04

最新評(píng)論

青河县| 鹤山市| 武陟县| 云和县| 沾益县| 乌兰县| 平安县| 商都县| 南开区| 板桥市| 萨迦县| 龙州县| 慈利县| 杭州市| 平谷区| 韩城市| 绥宁县| 溧阳市| 都安| 于田县| 巫溪县| 静安区| 仪陇县| 松江区| 武安市| 临桂县| 霍州市| 紫金县| 大名县| 天门市| 新河县| 洪湖市| 历史| 明溪县| 乡城县| 岢岚县| 黑水县| 张家川| 崇州市| 太白县| 缙云县|