实现功能
端口扫描
具体用法
我们这里是模仿nmap扫描工具那种用法,在执行程序的时候要加入参数来调用,如图所示:
运用的模块
sys(用来接收追加的参数)、socket(用来判断端口是否开放)、re(使用正则来提取端口列表)
最终代码
import socket
import sys
import re
port_list = [22, 80, 3389, 21, 3306, 1521, 1433] # 常用端口
def open_test(ip, port):
# 用socket连接探测端口是否开放
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((ip, port))
return True
except:
return False
def scan_port(ip):
# 调用上面的方法来返回是否开放
if len(port_list) > 2:
for i in port_list:
if open_test(ip, int(i)):
print('%s host %s is open' % (ip, i))
else:
print('%s host %s is close' % (ip, i))
else:
if open_test(ip, port_list):
print('%s host %s is open' % (ip, port_list))
else:
print('%s host %s is close' % (ip, port_list))
try:
# 捕获异常,CTRL+C 时打印 程序终止 而不是报错
if len(sys.argv) == 1:
# 打印使用帮助
print('''
This program prints files to the standard output.
Any number of files can be specified.
Options include:
python scanport.py ip ports
python scanport.py 127.0.0.1 扫描默认端口
python scanport.py 127.0.0.1 22,80,21,23...
python scanport.py 127.0.0.1 80-89
python scanport.py 127.0.0.1 21,23,80-89
python scanport.py 127.0.0.1 21,23,80-89,135
python scanport.py 127.0.0.1 80-89,135
python scanport.py 127.0.0.1 all
''')
elif len(sys.argv) == 2:
# 扫描默认端口
scan_port(sys.argv[1])
elif len(sys.argv) == 3:
if ',' in sys.argv[2]:
if '-' in sys.argv[2]:
# 如果同时包含,和- 用以下方法筛选出端口
port_list = sys.argv[2].split(',')
# print(port_list)
length = len(port_list)
for i in range(0, length):
if '-' in port_list[i]:
p = re.findall('\\d\\d', port_list[i]) # 使用正则将开始和末尾的元素拿出来
# print(p)
port_list.remove(port_list[i])
# print(port_list)
for j in range(int(p[0]), int(p[1])+1):
port_list.append(str(j)) # 转换成字符串加入进列表中
# print(port_list)
scan_port(sys.argv[1])
else:
# 第二种方式
port_list = sys.argv[2].split(',')
scan_port(sys.argv[1])
elif '-' in sys.argv[2]:
# 第三种方式
temp = sys.argv[2].split('-')
port_list = range(int(temp[0]), int(temp[1])+1)
scan_port(sys.argv[1])
elif sys.argv[2] == 'all':
# 第四种方式
port_list = range(1, 65535)
scan_port(sys.argv[1])
else:
port_list = sys.argv[2]
scan_port(sys.argv[1])
except KeyboardInterrupt:
print('Program end!')
结果展示
扫描默认端口:
扫描自定义端口:
扫描固定范围端口:
也可以混合一起使用:
扫描所有端口(1-65535):
这样简单的端口扫描程序就写好了,欢迎各位师傅们一起交流~