• 【夏虫语冰】测试服务器端口是否打开(命令行、Python)


    1、简介

    接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点来,通过一些特殊的规则也就是协议,来进行数据之间的交互。

    一台服务器为什么可以同时是Web服务器,也可以是FTP服务器,还可以是邮件服务器呢,其中一个很重要的原因是各种服务采用不同的端口分别提供不同的服务,比如:通常TCP/IP协议规定Web采用80号端口,FTP采用21号端口等,而邮件服务器是采用25号端口。这样,通过不同端口,计算机就可以与外界进行互不干扰的通信。

    在这里插入图片描述

    2、命令行

    2.1 telnet

    2.1.1 工具简介

    Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。telnet是基于tcp/ip协议的,因此只能用于检测tcp的端口是否开放。
    在这里插入图片描述
    在这里插入图片描述

    2.1.2 工具配置

    telnet ip port
    
    • 1

    之前测试服务器某一端口开启开启情况一般在服务器上使用 netstat –ano|findstr “端口号”命令查看。
    但是有时候端口在服务器上开通了,但是客户端并不一定可以访问到,那么在客户端上如何验证机器是否可以正常访问到服务器的端口呢?可以使用telnet命令来查看。
    输入一下命令检查telnet是否配置好了。

    telnet
    
    • 1

    在这里插入图片描述
    发现telnet命令没有找到。如果提示“不是内部或外部命令”则需要在“程序和功能”中开启telnet。
    需要配置一下。在控制面板中选择“程序和功能”,在“程序和功能”界面选择“打开或关闭Windows功能”。在弹出的“windows功能”窗口中将Telnet服务器和Telnet客户端勾选并保存设置。设置完成后需要重新打开一个命令行窗口运行telnet命令,设置前打开的命令窗口运行telnet是无效的。具体步骤如下:
    在这里插入图片描述
    控制面板——程序——启动或关闭windows功能——勾上telnet client。
    在这里插入图片描述
    在这里插入图片描述

    2.1.3 工具使用

    然后再测试一下telnet命令.

    telnet
    
    • 1

    在这里插入图片描述
    说明配置成功。
    我们再试试测试一下一个不存在的端口。

    telnet 127.0.0.1 80
    
    • 1

    在这里插入图片描述
    提示报错了。
    我们再试试测试一下百度。

    telnet www.baidu.com 80
    
    • 1

    在这里插入图片描述
    在CMD命令框中输入 “telnet IP地址或者域名 端口号”,如果弹出黑色窗体,表示连接成功。
    接着操作如下:

    ctrl+]
    st
    
    • 1
    • 2

    在这里插入图片描述

    2.2 curl

    2.2.1 工具简介

    curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。

    curl 的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。

    curl 支持DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS、TELNET、TFTP、WS 和 WSS。curl 支持 TLS 证书、HTTP POST、 HTTP PUT,FTP 上传,基于 HTTP 表单的上传,代理(SOCKS4、SOCKS5、HTTP 和 HTTPS), HTTP/2, HTTP/3, cookie, 用户+密码身份验证 (基本, Plain, Digest, CRAM-MD5, SCRAM-SHA, NTLM, Negotiate, Kerberos, Bearer tokens 和 AWS Sigv4)、文件传输恢复、代理隧道、HSTS、Alt-Svc、unix 域套接字,HTTP压缩(gzip,brotli和zstd),etags,并行 传输、HTTPS 上的 DNS 等。

    2.2.1 工具下载

    2.2.1 工具使用

    curl ip:port
    
    • 1

    我们再试试测试一下百度。

    curl www.baidu.com
    
    • 1

    在这里插入图片描述

    curl 127.0.0.1
    # or
    curl 127.0.0.1:5000
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.3 wget

    2.3.1 工具简介

    命令行实用工具 使用 HTTP、HTTPS 和 FTP 协议检索文件。
    wget是一个强力方便的命令行下的下载工具,可以通过HTTP和FTP协议(两种最广泛的互联网协议)从因特网中检索并获取文件。

    2.3.2 工具下载

    https://eternallybored.org/misc/wget/
    在这里插入图片描述

    2.3.2 工具使用

    wget ip:port
    # or
    wget localhost:5000
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.4 nc

    2.4.1 工具简介

    nc命令是功能强大的网络工具。nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具。
    比如大家很熟悉使用telnet测试tcp端口,而nc可以支持测试linux的tcp和udp端口,而且也经常被用于端口扫描,甚至把nc作为server以TCP或UDP方式侦听指定端口做简单的模拟测试。

    nc(netcat) 是一个简单的 Unix 工具,它使用 TCP 或 UDP 协议去读写网络连接间的数据。

    2.4.2 工具安装

    工具安装命令:

    yum install nc -y
    
    • 1

    2.4.3 工具使用

    # nc -z -v -n 127.0.0.1 6379
    # nc -z -v -n 172.17.26.137 6379
    # nc -z ip port 或 nc -v -w 1 ip -z port
    # nc –uz IP port(u代表UDP)
    
    nc -v -w 1  ip -z port
    # or
    nc -v -w 1  localhost -z 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.5 ssh

    2.5.1 工具简介

    SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。
    在这里插入图片描述

    • SSH和其他传输协议的区别
      • 传统远程登录和文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。

      • SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的网络服务。作为Telnet和其他不安全远程shell协议的安全替代方案,目前SSH协议已经被全世界广泛使用,大多数设备都支持SSH功能。
        在这里插入图片描述

    • SSH和SSL的区别
      • SSH和SSL都是网络安全协议,通过加密和认证提升两台设备间传输数据的安全性。但SSH和SSL的生效方式和服务目标存在差异。
      • SSH在两台设备间创建安全隧道,使这两台设备间可以安全地发送命令、传输数据等。例如,客户端通过SSH远程登录到一台服务器上,就可以安全地远程管理这台服务器,在服务器上执行想要的命令。
      • SSL则是使用SSL证书保证两台设备间安全地传输数据,而不是像SSH那样可以执行命令。例如,用户通过浏览器访问某安装了SSL证书且启用了HTTPS的服务器,浏览器和服务器之间可以安全地传输数据。
      • SSH就像一辆汽车,我们看不到这辆封闭的汽车里装载的是什么。而SSL就像一个封闭的集装箱,我们可以用不同的交通工具运输它,但看不到集装箱里装的是什么。

    在 Linux 系统上 SSH 是非常常用的工具,通过 SSH Client 我们可以连接到运行了 SSH Server 的远程机器上。SSH Client 的基本使用方法是:

    ssh -v -p port username@ip
    # or
    ssh user@remote -p port
    
    • 1
    • 2
    • 3

    user 是你在远程机器上的用户名,如果不指定的话默认为当前用户
    remote 是远程机器的地址,可以是 IP,域名,或者是后面会提到的别名
    port 是 SSH Server 监听的端口,如果不指定的话就为默认值 22

    • windows
      在这里插入图片描述
    • linux
      在这里插入图片描述

    2.5.2 工具使用

    ssh -v -p port username@ip
    
    • 1

    2.6 nmap

    2.6.1 工具简介

    nmap(“Network Mapper”)是一个用于网络探索和安全审计的开源工具,被设计用来快速地扫描大规模网络,尽管对于单个主机它也同样能够正常工作。

    nmap 扫描器主要基本功能有三个,一是探测一组主机是否在线,其次是扫描主机端口,嗅探所提供的网络服务,还可以推断主机所用的操作系统。也可以深入探测 UDP 或者 TCP 端口,直至主机所使用的操作系统;还可以将所有探测结果记录到各种格式的日志中, 供进一步分析操作。

    2.6.2 工具安装

    yum install nmap -y
    #or
    sudo apt install nmap
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.6.2 工具使用

    nmap 127.0.0.1 -p 80
    
    • 1

    在这里插入图片描述
    检测端口成功!!!

    nmap 127.0.0.1 -p 8080
    
    • 1

    在这里插入图片描述
    检测端口失败!!!

    查看当前开放的端口:nmap localhost;
    查看主机端口(1024-65535)中开放的端口:nmap -p 1024-65535 localhost;
    探测目标主机开放的端口:nmap -PS ip 地址;
    探测所列出的目标主机端口:nmap -p22,80,3306 ip 地址;
    探测目标主机操作系统类型、端口服务名称、版本信息:nmap -sV -O localhost。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 扫描具有范围的所有TCP端口 (Scan All TCP Ports with Range)
      我们可以使用-p选项指定端口范围。 我们知道TCP端口号介于和65535 。 我们将使用-p0-65535作为选项,以扫描所有TCP端口。 我们未指定TCP协议,因为Nmap端口扫描的默认协议为TCP。
    nmap -p0-65535 192.168.122.1
    
    • 1
    • 更快扫描所有端口 (Faster Scan For All Ports)
      如果我们要扫描所有端口,则将花费大量时间。 如果情况不是很紧急,我们可以使用带有-T5参数的更快扫描。 这是Nmap最快的扫描级别。 此选项也可用于UDP扫描。
    nmap  -p0-65535 192.168.122.1 -T5
    
    • 1

    3、Python

    3.1 sock.connect_ex

    使用socket模块的connect_ex来判断端口是否打开

    import socket
    
    def check_port(ip, port):  
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
        sock.settimeout(5)  
      
        try:  
            result = sock.connect_ex((ip, port))  
            if result == 0:  
                return True
            else:  
                return False
        except Exception as e:  
            print(f"错误: {str(e)}")  
        finally:  
            sock.close()
    
    if __name__ == '__main__':      
        host = 'localhost'
        port = 8000
        if check_port(host, port):
            print(f'The port {port} on {host} is open.')
        else:
            print(f'The port {port} on {host} is closed.')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    执行结果如下:
    在这里插入图片描述

    3.2 sock.connect

    import socket
    
    def check_port(host, port):
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(1)
            sock.connect((host, port))
            sock.close()
            return True
        except:
            return False
        finally:  
            sock.close()
    
    if __name__ == '__main__':
        ret = check_port('127.0.0.1', 80)
        print("80: ", ret)
        ret = check_port('127.0.0.1', 8000)
        print("8000: ", ret)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    3.3 telnet命令

    telnet <IP地址> <端口>
    
    • 1
    import os  
      
    def check_port(ip, port):  
        result = os.system(f"telnet {ip} {port}")   #windows
        # result = os.system(f"telnet {ip} {port} > /dev/null 2>&1")  #linux
        if result == 0:  
            print(f"端口 {port} 是开放的")  
        else:  
            print(f"端口 {port} 是关闭的")
    
    if __name__ == '__main__':
        ret = check_port('127.0.0.1', 80)
        print("80: ", ret)
    
        # ret = check_port('127.0.0.1', 8000)
        # print("8000: ", ret)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    3.4 nc命令

    nc -zv <IP地址> <端口>
    
    • 1
    import os  
      
    def check_port(ip, port):  
        result = os.system(f"nc -zv {ip} {port} > /dev/null 2>&1") 
        if result == 0:  
            print(f"端口 {port} 是开放的")  
        else:  
            print(f"端口 {port} 是关闭的")
    
    if __name__ == '__main__':
        # ret = check_port('127.0.0.1', 80)
        # print("80: ", ret)
    
        ret = check_port('127.0.0.1', 8000)
        print("8000: ", ret)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.5 ping命令

    ping <IP地址> -n <端口>
    
    • 1
    import os  
      
    def check_port(ip, port):  
        # result = os.system(f"ping {ip} -n {port} > /dev/null 2>&1")  
        result = os.system(f"ping {ip} -n {port} ")  
        if result == 0:  
            print(f"端口 {port} 是开放的")  
        else:  
            print(f"端口 {port} 是关闭的")
    
    if __name__ == '__main__':
        # ret = check_port('127.0.0.1', 80)
        # print("80: ", ret)
    
        ret = check_port('127.0.0.1', 8000)
        print("8000: ", ret)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    3.6 requests检查http端口

    import requests  
      
    def check_port(ip, port):  
        try:  
            response = requests.get(f"http://{ip}:{port}")  
            if response.status_code == 200:  
                print(f"端口 {port} 是开放的")  
            else:  
                print(f"端口 {port} 是关闭的")  
        except requests.exceptions.ConnectionError:  
            print(f"端口 {port} 是关闭的")
            
    if __name__ == '__main__':
        # ret = check_port('127.0.0.1', 80)
        # print("80: ", ret)
    
        ret = check_port('127.0.0.1', 8000)
        print("8000: ", ret)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    3.7 Scapy库

    Scapy是一个由Python编写的强大工具,目前很多优秀的网络扫描攻击工具都使用了这个模块。也可以在自己的程序中使用这个模块来实现对网络数据包的发送、监听和解析。这个模块相对于Nmap来说,更为底层。可以更直观的了解网络中的各类扫描攻击行为。

    Scapy是一个 Python程序,它允许用户发送、嗅探、分析和伪造网络包。这种能力允许构建能够探测、扫描或攻击网络的工具。

    Scapy是一个强大的交互式包操作程序。它能够伪造或解码大量协议的数据包,在网络上发送它们,捕获它们,匹配请求和响应,等等。Scapy可以轻松地处理大多数经典任务,如扫描、跟踪、探测、单元测试、攻击或网络发现。它可以代替hping、arpsoof、arp-sk、arping、p0f甚至Nmap、tcpdump和tshark的某些部分。

    • 安装Scapy库
    pip install scapy
    
    • 1

    在这里插入图片描述

    • 代码测试
    from scapy.all import *  
      
    def check_port(ip, port):  
        # 构造一个ICMP数据包,并发送到目标IP地址和端口  
        packet = IP(dst=ip) / ICMP() / Raw(load=str(port))  
        # 发送数据包并获取响应  
        response = sr1(packet, timeout=1)  
        # 检查响应是否为ICMP错误类型  
        if response is None or response.type != ICMP.DEST_UNREACH:  
            print(f"端口 {port} 是开放的")  
        else:  
            print(f"端口 {port} 是关闭的")
    
    if __name__ == '__main__':
        # ret = check_port('127.0.0.1', 80)
        # print("80: ", ret)
    
        ret = check_port('127.0.0.1', 8000)
        print("8000: ", ret)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    运行报错了,哈哈哈哈哈,等热心小伙伴告诉俺解决方法。

    结语

    如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
    如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
    如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
    感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

  • 相关阅读:
    命令执行漏洞
    GitHub最新发布,阿里十年架构师手写版spring全家桶笔记全新开源
    C语言--每日五道选择题--Day8
    Linux 命令(180)—— renice 命令
    springboot毕设项目宠物领养平台f2308(java+VUE+Mybatis+Maven+Mysql)
    Neo4j安装与配置
    ES6 入门教程 24 Module 的语法 24.4 import 命令 & 24.5 模块的整体加载
    2022-08-30 第六小组 瞒春 学习笔记
    第四次作业
    java基于springboot美食制作菜谱推荐网站设计289
  • 原文地址:https://blog.csdn.net/hhy321/article/details/133420436