通过上一篇网络编程基础-,大家对socket有了一定的认知,
本文整理的是对ip地址扫描,找出开放的端口,以及对域名的解析方法整理
任何工具的开发,一定是有需求才会去做
像是站长工具这一类的端口扫描工具是怎么做的呢?
其实很简单! 利用Socket就可以完成,而且效果要比它来的更好一些
话不多说,下面开始步入正题
需求:
1、对ip地址进行扫描,看地址是否有效,并在一定范围内找出未被占用的端口号
2、解析域名
3、工具整合,用户可以自主选择1-2来使用
需求点一:对ip地址进行扫描,看地址是否有效,并在一定范围内找出未被占用的端口号
import socket
import re
def check_ip(ip): #利用正则,判断输入的ip是否符合规则
"""
:return: 是否符合规则
"""
ip_address = re.compile('((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}') #正则表达式对象
if ip_address.match(ip) and len(ip)!=0: #满足ip规则,并且是有数值的为True,否则为False
return True
else:
return False
def scan_port(ip): # 对传入的ip地址,在一定范围内扫描开放的端口,并打印
#取出范围值
port_begin,port_end = (1971,1991)
for oen in range(int(port_begin),int(port_end)+1):
# 使用 ip 实现tcp连接
# AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.settimeout(0.5) # 设置延迟5s
#访问成功是由返回值:是0
conn = sk.connect_ex((ip,oen)) # 有返回值
if conn ==0:
print(f'主机:{ip},端口:{oen}已开放')
else:
pass
sk.close()
def scan_ip(): # 用户输入ip,并对整体需求点一进行整合
ip = input('请输入需要扫描的ip>>>')
#2- 使用ip判断函数--判断
if check_ip(ip):# 调用check_ip方法,返回True时,走到这里
# 进入扫描端口
scan_port(ip)
else:
print("ip格式有误,请检查!")
需求点二:解析域名
def domain_name_scan():
#1- 输入域名
domainName = input('请输入域名>>>')
#2- 可以做域名判断
if "http://" in domainName or "https://" in domainName:
domainName = domainName[domainName.find("://")+3:] # 取前后下标
print("正在解析的域名>>>",domainName)
# 3- 获取ip
server_ip = socket.gethostbyname(domainName) # socket 自带的解析域名方法,返回ip
print(f"该域名{domainName}的ip>>>{server_ip}")
# 4- 进入扫描端口
scan_port(server_ip)
需求点三:工具整合,用户可以自主选择1-2来使用
def main():
info = """
1.使用IP扫描
2.使用域名扫描
"""
print(info)
#2- 接收用户输入
select = input("请选择>>> ")
if select =="1":
# ip扫描
scan_ip()
elif select =="2":
#域名扫描
domain_name_scan()
else:
print("输入有误!")
if __name__ == '__main__':
main()
方法调用
IP扫描
域名扫描
在测试工作中,安全测试就需要用到这一类的工具,因为需要扫描有哪些端口是不该开放的,存在安全隐患的端口,就可以通过工具对其扫描,并及时规避问题。
但工具肯定不会这么简陋,这个只能当作入门~
有问题及时沟通,大家一起进步