Python网络管理

1.使用python-nmap进行端口扫描

python-nmap是对nmap的封装,它会将输出结果保存在字典中。使用只需要创建一个PortScanner对象,再调用对象的scan的方法进行扫描。

>>> import nmap
>>> nm = nmap.PortScanner()
>>> nm.scan('192.168.1.107','22-1000')
{'nmap': {'command_line': 'nmap -oX - -p 22-1000 -sV 192.168.1.107', 'scaninfo': {'tcp': {'method': 'syn', 'services': '22-1000'}}, 'scanstats': {'timestr': 'Sat Sep 12 15:09:39 2020', 'elapsed': '42.80', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'192.168.1.107': {'hostnames': [{'name': '', 'type': ''}], 'addresses': {'ipv4': '192.168.1.107'},
......

#查看命令行参数
>>> nm.command_line()
'nmap -oX - -p 22-1000 -sV 192.168.1.107'
#查看扫描方法
>>> nm.scaninfo()
{'tcp': {'method': 'syn', 'services': '22-1000'}}
#查看主机列表
>>> nm.all_hosts()
['192.168.1.107']
#查看单台主机的状态
>>> nm['192.168.1.107'].state()
'up'
#查看单台主机对应的服务
>>> nm['192.168.1.107']['tcp'][443]

2.使用IPy进行IP地址管理

1)IP管理

IPy模块有一个IP类。

#查询IP类型
>>> IP('192.168.1.0').iptype()
'PRIVATE'
>>> IP('8.8.8.8').iptype()
'PUBLIC'
#得到IP的整数形式
>>> IP('192.168.1.0').int()
3232235776
#得到IP的十六进制形式
>>> IP('192.168.1.0').strHex()
'0xc0a80100'
#得到IP的二进制形式
>>> IP('192.168.1.0').strBin()
'11000000101010000000000100000000'
#将整数型IP形式转换为IP地址
>>> IP(3232235776)
IP('192.168.1.0')

2)网段管理

计算子网IP数

>>> IP('192.168.1.0/24').len()
256
>>> ips = IP('192.168.1.0/24')
>>> ips.len()
256
>>> for ip in ips:
... print(ip)
...
192.168.1.0
192.168.1.1
192.168.1.2

IP类有一个strNormal的方法,该方法接受一个wantprefixlen的参数,参数的取值为0-3,每一个值代表一种网段的显示方式。

>>> ips.strNormal(0)
'192.168.1.0'
>>> ips.strNormal(1)
'192.168.1.0/24'
>>> ips.strNormal(2)
'192.168.1.0/255.255.255.0'
>>> ips.strNormal(3)
'192.168.1.0-192.168.1.255'

判断IP是否属于某个网段

ips = IP('192.168.1.0/24')
>>> '192.168.1.1' in ips
True
>>> '192.168.0.1' in ips
False

判断子网是否包含于另一个网段中

>>> IP('192.168.1.0/28') in ips
True
>>> IP('192.168.0.0/16') in ips
False

获取子网掩码以及广播地址

>>> ips.netmask()
IP('255.255.255.0')
>>> ips.broadcast()
IP('192.168.1.255')

3.使用dnspython解析DNS

dnspython提供了一个dns解析类resolver,它的resolve方法可以实现域名查询功能。

dns.resolver.query(qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_on_answer=True,source_port=0)

qname:查询的域名

rdtype:指定RR资源(A/NS/MX/CNAME/PTR)

rdclass:网络类型

tcp:指定查询是否启用tcp

source:查询源的地址

source_port:查询源的端口

raise_on_on_answer:指定查询无应答时是否触发异常,默认为True

>>> data = dns.resolver.resolve('fangxiaoxiong.com','A')
>>> for item in data.response.answer:
... print(item)
...
fangxiaoxiong.com. 5 IN A 47.103.65.197


「 文章如果对你有帮助,请点个赞哦^^ 」 

0