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

使用SpringBoot+nmap4j獲取端口信息的代碼詳解

 更新時間:2025年01月12日 14:56:09   作者:發(fā)憤圖強的羔羊  
這篇文章主要介紹了使用 SpringBoot + nmap4j 獲取端口信息,包括需求背景、nmap4j 的相關介紹、代碼說明(含測試代碼、改造后的代碼及參數說明),還提到了文件讀取方式和依賴引入方式,最終請求能獲取到數據,需要的朋友可以參考下

序言

今天在工作的時候,領導突然安排和我說一個需求,就是根據一個 ip 和 端口去獲取對應服務上對應端口的信息,當時主要是為了確定數據庫的版本和型號,比如 MySQL、Oracle 這些數據庫,我后面嘗試發(fā)現(xiàn)其他端口也可以獲取信息。這個在公司里之前是通過 python 來寫的,python 里面剛好有這個模塊,但是 Java 沒有,所以寫這篇文章記錄一下,幫助大家以后避免踩坑。

nmap4j

nmap4j 是一個用于 Java 語言的 Nmap 端口掃描器的包裝庫,它允許 Java 開發(fā)者在自己的項目中方便地調用 Nmap 的功能進行網絡掃描和探測。

在運行這個代碼之前,我們是需要下載 nmap 的可執(zhí)行文件,地址為:Download the Free Nmap Security Scanner for Linux/Mac/Windows

這里下載第一個,下載后安裝就行了。

代碼說明

接下來和大家說一下 nmap4j 中的測試代碼,這里面有個坑,我當時找了好久,代碼在 test/org/nmap4j/Nmap4jTest.java

    public class Nmap4jTest {
	
	
	@Test
	public void basicNmap4jUsageTest() {
		
		try {
               // 這里的路徑要改為剛才 nmap 軟件的安裝路徑
			String path = "/usr/local" ;
			
			Nmap4j nmap4j = new Nmap4j( path ) ;
               // 這地方使用了 -oX 后面要跟文件名稱
			nmap4j.addFlags( "-sV -T5 -O -oX -" ) ;
			nmap4j.includeHosts( "localhost" ) ;
			nmap4j.execute() ;
			if( !nmap4j.hasError() ) {
                        
				NMapRun nmapRun = nmap4j.getResult() ;  // 這一行一定要注釋掉,不然會一直報錯
				String output = nmap4j.getOutput() ;  // 這一樣代碼意義也不大,我直接刪掉了
				if( output == null ) {
					fail() ;
				}
				String errors = nmap4j.getExecutionResults().getErrors() ;
				if (errors == null ) {
					fail() ;
				}
			}
		} catch (NMapInitializationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			fail() ;
		} catch (NMapExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			fail() ;
		}
		
	}

}

參數說明:

  • 目標選擇參數:

    • -iL :從文件中讀取掃描目標列表。例如,nmap -iL targets.txt,會從targets.txt文件中讀取每行一個的 IP 地址或域名作為掃描目標。
    • -iR :隨機選擇指定數量的主機進行掃描。如nmap -iR 100,會隨機選取 100 個主機進行掃描。
    • --exclude <host1[,host2,...]> :排除指定的主機或網絡不進行掃描。例如,nmap 192.168.1.0/24 --exclude 192.168.1.100,192.168.1.200,將掃描192.168.1.0/24網段,但排除192.168.1.100192.168.1.200這兩臺主機。
    • --excludefile <exclude_file> :從文件中讀取要排除的主機或網絡列表。
  • 掃描類型參數

    • -sS:TCP SYN 掃描,也稱為半開放掃描。它發(fā)送 SYN 包到目標端口,如果收到 SYN/ACK 響應,就表示端口開放;如果收到 RST 響應,則表示端口關閉。這種掃描方式速度快,且不容易被目標系統(tǒng)記錄,相對隱蔽,例如nmap -sS 192.168.1.100。
    • -sT:TCP 連接掃描,通過完整的 TCP 三次握手來確定端口是否開放。這種掃描方式最準確,但也最容易被檢測到,如nmap -sT 192.168.1.100。
    • -sU:UDP 掃描,用于檢測目標主機上的 UDP 端口是否開放。因為 UDP 是無連接協(xié)議,所以判斷端口狀態(tài)相對復雜,nmap -sU 192.168.1.100可對指定主機進行 UDP 掃描。
    • -sF、-sX、-sN:分別是 FIN 掃描、XMAS 掃描和 NULL 掃描。這些掃描方式通過發(fā)送特殊標志位的 TCP 包來判斷端口狀態(tài),常用于繞過一些簡單的防火墻檢測。
  • 端口指定參數

    • -p :指定要掃描的端口范圍??梢允菃蝹€端口,如-p 80;也可以是多個端口,如-p 80,443,8080;還可以是端口范圍,如-p 1-1000表示掃描 1 到 1000 號端口。
    • --top-ports :掃描最常用的指定數量的端口。例如,nmap --top-ports 100 192.168.1.100會掃描目標主機上最常用的 100 個端口。
    • -F:快速掃描模式,只掃描一些常見的端口,相當于-p 1-1024加上一些其他常用端口。
  • 服務探測參數

    • -sV:啟用服務版本探測,嘗試確定目標主機上運行的服務及其版本信息。例如,nmap -sV 192.168.1.100可以掃描出目標主機開放端口上運行的服務名稱和版本號。
    • --version-intensity :設置服務版本探測的強度,級別越高,探測越全面,但耗時也越長,取值范圍是 0 到 9。
  • 操作系統(tǒng)探測參數

    • -O:啟用操作系統(tǒng)探測,嘗試識別目標主機的操作系統(tǒng)類型和版本。如nmap -O 192.168.1.100
    • --osscan-limit:限制操作系統(tǒng)探測只對可能的目標進行,這樣可以加快掃描速度,但可能會降低準確性。
    • --osscan-guess:更積極地猜測操作系統(tǒng)類型,當 Nmap 不確定時會給出更寬泛的猜測結果。
  • 輸出參數

    • -oN :將掃描結果以正常格式保存到指定文件。例如,nmap -oN scan_results.txt 192.168.1.100會把掃描結果保存到scan_results.txt文件中。
    • -oX :將掃描結果以 XML 格式保存到指定文件,方便后續(xù)使用腳本或其他工具進行解析和處理。
    • -oG :將掃描結果以 Grep 格式保存,這種格式便于使用文本處理工具進行分析。
    • -oA :以多種格式(包括正常、XML 和 Grep 格式)保存掃描結果,文件名為指定的基本名稱加上相應的擴展名。
    • -v:詳細輸出模式,顯示更多的掃描過程信息,如發(fā)送的數據包、收到的響應等。使用多個v可以增加詳細程度,如-vv-vvv。

這里給大家看一下改造后的代碼

/**
 * 使用 nmap4j 工具進行掃描
 *
 * @param ip    目標 ip
 * @param ports 目標端口
 * @return 端口信息列表
 */
@RequestMapping("/querydb")
public List<NmapPortInfo> querydb(@RequestParam(value = "ip") String ip, @RequestParam("ports") List<String> ports) {
    ArrayList<NmapPortInfo> portInfos = new ArrayList<>();
    // 1.拼接端口
    String portStr = StrUtil.join(",", ports);
    //2. 指定 nmap 路徑
    String path = "D:/StudyApps/nmap";
    String fileName = "temp_result.xml";

    Nmap4j nmap4j = new Nmap4j(path);

    //3.讀取端口耗時較長,可以使用異步
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
        nmap4j.addFlags("-sV -p " + portStr + " -T5 -O -oX " + fileName);
        nmap4j.includeHosts(ip);
        try {
            nmap4j.execute();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }, threadPoolExecutor);

    future.join();

    //4. 獲取端口信息
    return getPortInfo(portInfos, fileName);
}
/**
     * 獲取 ip + 端口信息,封裝為集合返回前端
     *
     * @param portInfos 返回前端集合
     * @param fileName  臨時的 xml 文件
     * @return 信息列表
     */
    @SneakyThrows
    private List<NmapPortInfo> getPortInfo(List<NmapPortInfo> portInfos, String fileName) {
        // 獲取項目所在路徑
        String projectPath = System.getProperty("user.dir");
        // 拼接文件路徑
        String filePath = projectPath + FileUtil.FILE_SEPARATOR + fileName;
        log.info("文件路徑:{}", filePath);

        // nmap 返回 xml 格式固定,使用 dom4j 解析
        SAXReader reader = new SAXReader();
        org.dom4j.Document document = reader.read(FileUtil.file(filePath));
        org.dom4j.Element rootElement = document.getRootElement();
        org.dom4j.Element element = rootElement.element("host");

        org.dom4j.Element xmlPorts = element.element("ports");

        List<org.dom4j.Element> port = xmlPorts.elements("port");
        for (org.dom4j.Element port1 : port) {
            Element service = port1.element("service");
            String product = service.attributeValue("product");
            String version = service.attributeValue("version");
            NmapPortInfo nmapPortInfo = new NmapPortInfo(product, version);
            portInfos.add(nmapPortInfo);
        }

        // 刪除臨時文件
        FileUtil.del(filePath);
        return portInfos;
    }
}

我這里就是沒有去按照官網上的寫法,我的思路是文件已經下載了我直接去讀取 xml 文件解決會更快,這里是使用 dom4j 來讀取的 xml 文件。代碼就這么多,最后請求是可以獲取到數據的:

總結

忘記和大家說了,nmap4j 在maven倉庫是搜不到的,所以只通過 jar 包(點擊下載)的方式來引入。

以上就是使用SpringBoot+nmap4j獲取端口信息的代碼詳解的詳細內容,更多關于SpringBoot nmap4j獲取端口信息的資料請關注腳本之家其它相關文章!

相關文章

  • mybatis執(zhí)行update批量更新時報錯的解決方案

    mybatis執(zhí)行update批量更新時報錯的解決方案

    這篇文章主要介紹了mybatis執(zhí)行update批量更新時報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java數組實現(xiàn)動態(tài)初始化的實例詳解

    Java數組實現(xiàn)動態(tài)初始化的實例詳解

    在本篇文章里小編給大家整理的是一篇關于Java數組實現(xiàn)動態(tài)初始化的實例詳解內容,有興趣的朋友們可以學習下。
    2021-10-10
  • Spring中循環(huán)依賴的解決方法詳析

    Spring中循環(huán)依賴的解決方法詳析

    這篇文章主要給大家介紹了關于Spring中循環(huán)依賴的解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Spring AOP 自定義注解的實現(xiàn)代碼

    Spring AOP 自定義注解的實現(xiàn)代碼

    本篇文章主要介紹了Spring AOP 自定義注解的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java自定義數組列表的實現(xiàn)操作

    Java自定義數組列表的實現(xiàn)操作

    這篇文章主要介紹了Java自定義數組列表的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 使用純java config來配置spring mvc方式

    使用純java config來配置spring mvc方式

    這篇文章主要介紹了使用純java config來配置spring mvc方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java算法之數組冒泡排序代碼實例講解

    Java算法之數組冒泡排序代碼實例講解

    這篇文章主要介紹了Java算法之數組冒泡排序代碼實例講解,文中用代碼舉例講解的很清晰,有感興趣的同學可以研究下
    2021-03-03
  • SpringBoot中Zookeeper分布式鎖的原理和用法詳解

    SpringBoot中Zookeeper分布式鎖的原理和用法詳解

    Zookeeper是一個分布式協(xié)調服務,它提供了高可用、高性能、可擴展的分布式鎖機制,SpringBoot是一個基于Spring框架的開發(fā)框架,它提供了對Zookeeper分布式鎖的集成支持,本文將介紹SpringBoot中的 Zookeeper分布式鎖的原理和使用方法,需要的朋友可以參考下
    2023-07-07
  • Java向上取整的幾種常見實現(xiàn)方法

    Java向上取整的幾種常見實現(xiàn)方法

    這篇文章主要介紹了Java向上取整的幾種常見實現(xiàn)方法,包括整數除法技巧、Math.ceil()函數、手動檢查余數、位運算和使用BigDecimal的setScale方法,每種方法都有其適用場景,選擇合適的方法可以提高代碼的性能和可讀性,需要的朋友可以參考下
    2024-12-12
  • MybatisPlus一對多聯(lián)表查詢及分頁的解決過程

    MybatisPlus一對多聯(lián)表查詢及分頁的解決過程

    文章主要介紹了在使用MyBatis-Plus進行一對多查詢時遇到的分頁問題及解決方案,在一對多場景下,直接映射會導致分頁數據數量不正確,而使用子查詢映射則可以解決這個問題,此外,通過在Java代碼中使用Stream進行關聯(lián)處理,可以進一步優(yōu)化查詢性能,避免多次子查詢帶來的效率問題
    2025-12-12

最新評論

澄江县| 都江堰市| 南昌市| 泸定县| 博罗县| 凤山县| 牟定县| 安庆市| 阳城县| 盈江县| 章丘市| 安泽县| 大邑县| 康乐县| 长寿区| 江阴市| 丰顺县| 读书| 来安县| 普洱| 获嘉县| 施甸县| 拜城县| 五河县| 韶山市| 岐山县| 关岭| 巴林右旗| 南漳县| 通江县| 靖边县| 石家庄市| 天台县| 桑日县| 丹巴县| 黄平县| 徐水县| 长汀县| 海盐县| 闸北区| 临江市|