扫描端口并列出每个端口上的服务 运行

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

我正在尝试构建一个端口扫描器,它不仅可以扫描端口号,还可以列出相应端口上的服务 运行。我是 ​​java 编程的新手,而且和你一样可以看到我有扫描本地机器端口状态的代码。在每个端口上列出服务 运行 时,我不知道从哪里开始。如果有人可以建议我 code/links 列出这些服务,我将不胜感激。感谢您的帮助.....

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);
            }
        }
    }
}

所以,您正在寻找类似 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();
            }
        }
    }
}

您无法轻易知道端口上的 运行 是什么服务,您只能使用 this 列表简单地假设该端口上的 运行 是什么服务。但请注意,Web 服务器可以使用自定义端口而不是默认端口。

如果您确实需要确切地知道 运行 在哪个端口上有什么服务,我建议您使用 Nmap 并从中制作一个 bash 脚本在 .txt 文件中输出它的发现。 .txt 文件随后可以被 Java 读取。这种方法可以节省大量工作。

如果您想检查打开的端口,代码似乎没问题,但要识别服务……好吧,这很棘手。

有点像通过读取前几个字节来识别文件类型。一个简单的解决方案是将端口号与 list of well known ports 进行比较。因此,如果端口 80 已打开,您只需假设它是 HTTP 并继续。

此方法假定服务实际侦听其分配的端口。这就像假设以 "zip" 结尾的文件始终是一个 zip 文件。大多数时候它是正确的,但这只是因为它是一种约定。不是因为它必须是这样的。如果你真的想要指纹服务——通过 "talking to it" 确定服务类型,那么这是一项严肃的工作,不是几行代码就能解释清楚的。我建议您看一下 Nmap,因为它是一个可以做到这一点的现有工具。您也许可以使用它而不是自己编写。