#! /usr/bin/python
# -\*- coding:UTF-8 -\*-
import socket
#客户端程序
def main():
s = socket.socket()
host = '192.168.0.101'#你要连接谁的ip地址
port = 12345
s.connect((host,port))#连接服务器
print(s.recv(1024).decode("utf-8")) # 接受信息
msg = input("您要发送的信息:")
s.send(msg.encode("utf-8"))#发送信息
s.close()
pass
if __name__ == '\_\_main\_\_':
main()
运行结果为:
server.py
对方的地址是: ('192.168.0.101', 62258)
hello
Process finished with exit code 0
client.py
Welcome
您要发送的信息:hello
Process finished with exit code 0
三、支持命令的端口扫描器
print(sys.argv)#输出所有的参数
print(sys.argv[0]) # 输出第一个参数
以下是一个简单的Python端口扫描器示例:
import socket
target_host = input("Enter the target host IP address: ")
start_port = int(input("Enter the starting port number: "))
end_port = int(input("Enter the ending port number: "))
def port\_scan(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
result = sock.connect_ex((target_host, port))
if result == 0:
print("Port {}: Open".format(port))
else:
print("Port {}: Closed".format(port))
sock.close()
for port in range(start_port, end_port+1):
port_scan(port)
使用时,输入要扫描的目标主机IP地址、起始端口号和结束端口号,程序会对这些端口进行扫描,输出端口状态。
实例
#! /usr/bin/python
# -\*-coding: UTF-8 -\*-
import socket
import sys
# 判断端口是否开放
def is\_open(ip, port):
s = socket.socket()
try:
s.connect(ip, port)
return True
except:
return False
# 默认扫描的函数
def scan(ip, portlist):
for x in portlist:
if is_open(ip, x):
print("%s的主机 %s 端口 open"%(ip,x))
else:
print("%s的主机 %s 端口 close"%(ip,x))
pass
#范围扫描
def rscan(ip,r,e):
for x in range(int(r),int(e)):
if is_open(ip,x):
print("%s的主机 %s 端口 open"%(ip,x))
else:
print("%s的主机 %s 端口 close"%(ip,x))
pass
def main():
defaultport = ['145','139','445','1433','3306','3389','6379','80','8080','7001','22','21','23','25']
#寻求帮助或者看版本
if len(sys.argv)==2:
if sys.argv[1]=='--help' or sys.argv[1]=='-h':
print("python test1.py [ip] ----默认扫描")
print("python test1.py [ip] [port:80,81,82或者port:80-90] ----自定义端口扫描")
elif sys.argv[1]=='--version' or sys.argv[1]=='-v':
print("程序版本为1.0")
sys.exit()
else:
#若使用默认扫描:python test1.py 127.0.0.1
scan(sys.argv[1],defaultport)
#参数有逗号的情况
elif len(sys.argv)==3:
if ',' in sys.argv[2]:
port_1 = sys.argv[2]
port_1 = port_1.split(',')
a = []
for x in port_1:
a.append(int(x))
scan(sys.argv[1],a)
#带‘-’范围扫描的情况
elif '-' in sys.argv[2]:
rport = sys.argv[2]
rport = rport.split('-')
r = rport[0]
e = rport[1]
rscan(sys.argv[1],r,e)
pass
if __name__ == '\_\_main\_\_':
main()
上述代码可以实现一些简易扫描器功能,但是比较麻烦和冗余
所以我们也可以考虑使用optparse
optparse是Python标准库中的一个模块,用于在命令行界面中解析命令行选项和参数。它提供了一种轻松创建符合Unix/Posix命令行界面标准的命令行选项。
optparse模块可以使命令行工具更加易用和灵活,同时还可以提高程序员的效率。
以下是一个简单的optparse的例子:
import optparse
parser = optparse.OptionParser()
parser.add\_option("-f", "--file", dest="filename",
help="read data from FILENAME")
parser.add\_option("-q", "--quiet",
action="store\_false", dest="verbose", default=True,
help="don't print status messages to stdout")
(options, args) = parser.parse\_args()
if options.verbose:
print("reading data from", options.filename)
使用optparse模块,我们可以将命令行中的选项和参数解析为相应的Python变量,并在程序中进行使用。
对于扫描器的实现,我们可以将扫描器所需的选项和参数作为optparse模块中的选项和参数,然后在程序中进行相应的处理。例如,我们可以添加以下选项:
-h, --help 显示帮助信息
-t, --target 指定扫描目标IP地址或网段
-p, --port 指定扫描目标端口号
-s, --speed 指定扫描速度
然后在程序中通过optparse模块解析相应的选项和参数,并进行扫描操作。
测试实例
#! /usr/bin/python
# -\*-coding: UTF-8 -\*-
from optparse import OptionParser
def main():
usage = "python xxx.py -f <filename> -i <address>" #帮助
parse = OptionParser(usage=usage)#添加usage方法,xx.py -h 就会出现上面的帮助
parse.add_option("-f","--file",type="string",dest="filename",help="your filename here")
parse.add_option("-i","--ipaddress",type="string",dest="ipadd",help="your ip address here")
(option,args) = parse.parse_args()#获取选项和参数进行赋值
print(option.filename)
print(option.ipadd)
pass
if __name__=='\_\_main\_\_':
main()
运行结果简单测试: