基于Python编写一个简单的端口扫描器

 更新时间:2022年04月08日 10:28:20   作者:somenzz  
端口扫描是非常实用的,不止用在信息安全方面,日常的运维也用得到。本文将利用Python编写一个简单的端口扫描器,需要的可以参考一下

端口扫描是非常实用的,不止用在信息安全方面,日常的运维也用得到。这方面的工具也不要太多,搞过 CTF 的朋友会告诉你有多少端口扫描工具,那为什么还要用 Python 再自己实现一遍?这个问题就像饭店里的菜已经很好吃了,为什么还要自己烧菜一样,主要还是为了适合自己的口味,添加自己需要的个性功能。

今天我们将用 20 行代码编写一个简单的端口扫描器。让我们开始吧!

1、需要的库

都是标准库,因此内网环境也不影响:

import socket
import argparse
import sys
import time

套接字库是一个低级网络接口库,它允许我们在脚本中创建网络连接。argparse 库用于解释传递给我们脚本的参数。sys 库允许我们与系统交互。最后,time 库用来统计耗时。

2、获取一个 host 地址

parser = argparse.ArgumentParser()
parser.add_argument('host')
args = parser.parse_args()

这样脚本在运行的时候,第一个参数就可以传入一个主机名或 ip 地址,下文就可以通过 args.host 来使用。

3、循环所有的端口

端口占用 2 个字节,因此其范围是 1-65535

start = time.time()
try:
    for port in range(1, 65536):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)
        result = sock.connect_ex((args.host, port))
        if result == 0:
            print("Port: {} Open".format(port))
        sock.close()
except KeyboardInterrupt:
    sys.exit()
end = time.time()

如果 sock.connect_ex 返回了 0 说明端口开放,为了让程序正常退出,我们加上 try except 来捕获键盘发起的中断。

4、完整脚本

一旦 for 循环完成并扫描了所有端口,我们将获取时间并打印出脚本运行的时间:

import socket
import argparse
import sys
import time

parser = argparse.ArgumentParser()
parser.add_argument('host')
args = parser.parse_args()
start = time.time()

try:
    for port in range(1, 65536):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)
        result = sock.connect_ex((args.host, port))
        if result == 0:
            print("Port: {} Open".format(port))
        sock.close()
except KeyboardInterrupt:
    sys.exit()

end = time.time()
print(f"Scanning completed in: {end-start:.3f}s")

除去空行,代码一共 20 行,运行效果如下:

到此这篇关于基于Python编写一个简单的端口扫描器的文章就介绍到这了,更多相关Python端口扫描器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pythotn条件分支与循环详解(2)

    pythotn条件分支与循环详解(2)

    这篇文章主要介绍了Python条件分支和循环用法,结合实例形式较为详细的分析了Python逻辑运算操作符,条件分支语句,循环语句等功能与基本用法,需要的朋友可以参考下
    2021-08-08
  • python 中pass和match使用方法

    python 中pass和match使用方法

    这篇文章主要介绍了python中pass和match使用方法,​pass​​ 语句不执行任何操作。语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句
    2022-08-08
  • Python获取某一进程的CPU利用率的方法详解

    Python获取某一进程的CPU利用率的方法详解

    这篇文章主要为大家详细介绍了如何使用Python实现获取某一进程的CPU利用率,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • 一篇文章带你了解python标准库--random模块

    一篇文章带你了解python标准库--random模块

    这篇文章主要给大家介绍了关于Python中random模块常用方法的使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Python通过文本和图片生成词云图

    Python通过文本和图片生成词云图

    这篇文章主要介绍了Python通过文本和图片生成词云图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python多版本安装与Jupyter Lab使用方式

    Python多版本安装与Jupyter Lab使用方式

    这篇文章主要介绍了Python多版本安装与Jupyter Lab使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • pytorch教程实现mnist手写数字识别代码示例

    pytorch教程实现mnist手写数字识别代码示例

    这篇文章主要讲解了pytorch教程中如何实现mnist手写数字识别,文中附有详细的代码示例,test准确率98%,有需要的朋友可以借鉴参考下
    2021-09-09
  • python math模块的基本使用教程

    python math模块的基本使用教程

    这篇文章主要介绍了python math模块的基本使用教程,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • Python常见报错解决之SciPy和NumPy版本冲突

    Python常见报错解决之SciPy和NumPy版本冲突

    Scipy是基于Numpy的科学计算工具库,方便、易于使用、专为科学和工程设计,是一个用于数学、科学、工程领域的常用软件包,这篇文章主要给大家介绍了关于Python常见报错解决之SciPy和NumPy版本冲突的相关资料,需要的朋友可以参考下
    2024-03-03
  • python命令 -u参数用法解析

    python命令 -u参数用法解析

    这篇文章主要介绍了python命令 -u参数用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论