[英]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.