Python实现端口扫描
工欲善其事必先利其器,所以有时我们就需要编写自己的脚本工具.
下面带来python实现目标端口扫描的教程,希望对大家所帮助.
注意:从2.7版本后不再使用:optparse模块不推荐使用,python不再更新该模块,后续的发展将推荐使用argparse模块。
由于工作性质原因,3.0版本下接触会比较多这里提一点.
教程准备:
1.使用了socket库,optparse库
socket库,网络接口库,主要提供了不同进程间的通讯,以及不同网络间的进程通讯.
optparse库,主要为脚本传递命令参数功能
2.需要知道我们是如何建立起连接的.
我们调用了socket库,并使用它建立连接,然后关闭它
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 实例化socket的类,并声明了使用的网络地址类型(socket.AF_INET),socket的类型是TCP类型(socket.SOCK_STREAM)
c.connect((ip_addr,prot)) # 建立连接,ip_addr为目标ip,prot为目标端口
c.close() # 关闭连接
3.设置我们的命令行参数,由于我们这次的教程,采用从字典中遍历端口的进行扫描的方式,所以我们设置命令行参数时,只需要指定ip地址即可,这里我们定义了一个自定义函数来实现功能
import optparse
def opt_cmd():
parser = optparse.OptionParser("脚本名 -H <目标ip>") # 当们在命令行输入错误时,进行提示
parser.add_option("-H",dest='ip_address',type="string",help="指定目标IP") #在这里add_option是核心,“-H”是设置的命令参数,dest是临时变量,type用来验证用户输入的类型是否与我们设置的类型相同,help是友好提示信息,一般用来描述这个add的作用,也可以不写
(options,args) = parser.parse_args() # 当定义好参数后我们就需要通知optparse来解析你的命令行程序,parse_args()会返回两个值,options(一个对象包含所有选项的值),args(位置参数列表解析后剩下的选项参数)
addr = options.ip_address # 将临时变量dest的值给了新的变量addr
return addr # 返回addr,也就是我们的输入的IP
4.读取我们的字典文件
prot_path = "port.txt" # 我们字典文件的存储路径
def prot_file(port_path):
port_w = open(port_path,"r") # 读取字典内容
port_list = duan_w.readlines() # 将读取的内容转换为列表
return port_list #返回这个列表
通过上面的了解,我们应该明白
· 如何建立连接,关闭连接
· 设置命令行参数
· 调用字典
接下来附上我们的整体代码,需要说明的是,由于我的端口字典存储在和脚本相同的目录下,所以需要先cd 到同级目录下执行
import socket
import optparse
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 实例化socket的类,并声明了使用的网络地址类型(socket.AF_INET),socket的类型是TCP类型(socket.SOCK_STREAM)
port_path = "port.txt" # 我们字典文件的存储路径
#端口扫描
def scan(addr,c):
portlist = port_file(port_path)
for i in portlist:
try:
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.connect((addr,int(i))) #建立连接
print(str(i)+"这个端口是开启的")
c.close()
except:
# ~ print(str(i)+"这个端口是关闭的")
c.close()
#字典内容获取
def port_file(port_path):
port_w = open(port_path,"r") # 读取字典内容
port_list = port_w.readlines() # 将读取的内容转换为列表
return port_list #返回这个列表
#设置命令参数
def opt_cmd():
parser = optparse.OptionParser("脚本名 -H <目标ip>") # 当们在命令行输入错误时,进行提示
parser.add_option("-H",dest='ip_address',type="string",help="指定目标IP") #在这里add_option是核心,“-H”是设置的命令参数,dest是临时变量,type用来验证用户输入的类型是否与我们设置的类型相同,help是友好提示信息,一般用来描述这个add的作用,也可以不写
(options,args) = parser.parse_args() # 当定义好参数后我们就需要通知optparse来解析你的命令行程序,parse_args()会返回两个值,options(一个对象包含所有选项的值),args(位置参数列表解析后剩下的选项参数)
addr = options.ip_address # 将临时变量dest的值给了新的变量addr
return addr # 返回addr,也就是我们的输入的IP
#进行调用
if __name__ == "__main__":
addr = opt_cmd()
scan(addr,c)