前言
上文已经实现UI,现在添加主功能,扫描IP功能
系列
Python多线程扫描主机 一 UI实现和展示_shaynerain的博客-CSDN博客
Python多线程扫描主机 二 范围IP&端口的扫描-CSDN博客
Python多线程扫描主机 三 范围IP&端口的扫描-CSDN博客
扫描功能
首先导入socket包,然后尝试使用IP和端口进行扫描,完成如下,直接运行可测试
import socket
def scan(ip, port):
connect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
connect.settimeout(2)
connect.connect((ip, port))
connect.close()
print('{}:{} connect success'.format(ip,port))
except Exception as e:
print('{}:{} connect failure'.format(ip,port))
return False
else:
return True
if __name__ == "__main__":
import time
spend = time.time()
ip = "192.168.1.1"
port = 80
scan(ip, port)
spend = time.time() - spend
print('消耗时间为', spend)
上面脚本直接使用TCP进行尝试连接,并设置了超时时间为2秒,可适当延长,防止有些网络确实因为慢而出错。在mian中尝试连接我的路由器,显示成功,结果如下:
范围扫描
首先扫描范围需要获取起始IP和端口,然后获取截至IP和端口
在获取后,循环创建需要扫描的IP和端口,代码如下
def get_ports(self):
"""
获取所有需要扫描的端口
:return:
"""
# 创建空的端口列表
ports = list()
# 如果是范围端口
if self.range_com:
# 获取开始端口
port1 = self.lineEdit_com_1.text()
# 获取结束端口
port2 = self.lineEdit_com_2.text()
try:
# 转成数字
port1 = int(port1)
# 转成数字
port2 = int(port2)
pass
except Exception as e:
# 如果出错,则输入的有问题,进行弹窗提示
QtWidgets.QMessageBox.critical(self, "提示", "检查端口格式是否正确,(格式参考:80)",
QtWidgets.QMessageBox.Ok)
return None
# 在端口中进行循环
for i in range(port1, port2 + 1, 1):
# 添加到列表
ports.append(i)
# 指定端口号
else:
# 获取所有端口号
ports_text = self.textEdit_com.toPlainText()
# 替换空格
ports_text = ports_text.replace(' ', '')
# 替换换行符
ports_text = ports_text.replace('\n', '')
# 使用分号进行分割
ports_text = ports_text.split(';')
try:
# 尝试转换成数字
for i in range(len(ports_text)):
# 首先要保证不能是空的
if ports_text[i] != '':
# 添加到列表
ports.append(int(ports_text[i]))
# 如果异常
except Exception as e:
# 提示它是否输入正确
QtWidgets.QMessageBox.critical(self, "提示", "检查端口格式是否正确,(格式参考:80)",
QtWidgets.QMessageBox.Ok)
return None
# 返回所有端口
return ports
def get_ips(self):
"""
获取所有IP
:return:
"""
# IP列条
ips = list()
# 获取所有端口号
ports = self.get_ports()
# 判断是范围还是指定
if self.range_ip:
# 范围就需要知道多少个
ip1 = self.lineEdit_ip_1.text()
ip2 = self.lineEdit_ip_2.text()
# 添加到列表中
ip1_list = self.ip_to_list(ip1)
ip2_list = self.ip_to_list(ip2)
# 首先需要不是空的
if ip2_list is not None and ip1_list is not None:
# 在开始和结束之间循环,一共四个段,需要嵌套循环四次,来获取所有的
for i in range(ip1_list[0], ip2_list[0] + 1, 1):
for j in range(ip1_list[1], ip2_list[1] + 1, 1):
for k in range(ip1_list[2], ip2_list[2] + 1, 1):
for m in range(ip1_list[3], ip2_list[3] + 1, 1):
# IP循环完,需要在端口中进行循环,来获取最终要尝试连接的IP+端口号
for n in ports:
# 添加到列表中
ips.append(("{}.{}.{}.{}".format(i, j, k, m), n))
# 如果是指定
else:
# 获取所有IP
ips_text = self.textEdit_ip.toPlainText()
# 替换空格
ips_text = ips_text.replace(' ', '')
# 替换回车
ips_text = ips_text.replace('\n', '')
# 使用分号分割
ips_text = ips_text.split(';')
# 在里面循环检索
for m in ips_text:
# 不能有空的
if m != "":
# 现在是符合条件的,在端口中循环
for n in ports:
# 组合成IP+端口号,添加到列表中
ips.append((m, n))
# 返回所有
return ips
如此便生成了需要扫描的ip和端口,单线程中可以一个一个扫描。