簡體   English   中英

掃描端口並列出每個端口上運行的服務

[英]To scan for ports and to list the services running on each port

我正在嘗試構建一個端口掃描程序,它不僅掃描端口號,而且列出在相應端口上運行的服務。我是java編程的新手,並且如您所見,我有用於掃描端口狀態的代碼本地機器。 當列出每個端口上運行的服務時,我不知道從哪里開始。 如果有人可以向我建議任何列出這些服務的代碼/鏈接,我將不勝感激。 謝謝您的幫助.....

public class port {

    public static void main(String[] args) throws Exception {

        String host = "localhost";
        InetAddress inetAddress = InetAddress.getByName(host);
        String hostName = inetAddress.getHostName();

        for (int port = 0; port <= 200; port++) {
            try {
                Socket socket = new Socket(hostName, port);
                String text = hostName + " is listening on port " + port;
                System.out.println(text);
                socket.close();
            }
            catch (IOException e)
            {
                String s = hostName + " is not listening on port " + port;
                System.out.println(s);
            }
        }
    }
}

如果您要檢查打開的端口,但要識別服務,代碼似乎很好,那很棘手。

有點像通過讀取前幾個字節來識別文件的類型。 一個簡單的解決方案是將端口號與知名端口列表進行比較。 因此,如果打開了端口80,則只需假設它是HTTP並繼續前進即可。

此方法假定服務實際上在其分配的端口上進行偵聽。 這就像假設以“ zip”結尾的文件始終是zip文件。 在大多數情況下,這是正確的,但這僅僅是因為這是一個約定。 不是因為必須這樣。 如果您實際上想對服務進行指紋識別-通過“與之交談”來確定服務的類型,那么這是一項認真的工作,而不是可以在幾行中解釋的事情。 我建議您看一下Nmap ,因為它是一個完成此任務的現有工具。 您也許可以使用它,而不用自己編寫。

所以,您正在尋找類似Nmap東西嗎?

您的代碼對我來說似乎不錯,盡管我會做類似的事情

public class PortScanner {
    public static void main(String[] args) throws Exception {

        final String host = "localhost";
        final InetAddress inetAddress = InetAddress.getByName(host);
        final String hostName = inetAddress.getHostName();
        final List<int> openPorts = new ArrayList();

        // we begin at port 1 because port 0 is never used
        for (int port = 1; port <= 200; port++) {
            try {
                Socket socket = new Socket(hostName, port);
                openPorts.add(port);
            } catch (IOException) {
            } finally {
                socket.close();
            }
        }
    }
}

您不能輕易知道端口上正在運行什么服務,只能使用列表簡單地假設該端口上正在運行什么服務。 但是請注意,Web服務器可以使用自定義端口代替默認端口。

如果確實需要確切地知道哪個服務在哪個端口上運行,則建議您使用Nmap並從中制作一個bash腳本,然后將其結果輸出到.txt文件中。 然后可以用Java讀取該.txt文件。 這種方法節省了大量的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM