IPy模块
简介
IPy 是 Python 中的一个库,它提供了处理 IP 地址和子网的功能。使用这个库,可以方便地进行 IP 地址和子网的解析、验证、计算和操作。
基本使用
安装
pip install IPy
#引入模块
from IPy import IP
#创建 IP 对象
ip = IP('192.0.2.0') # 单个 IP 地址
ip = IP('192.0.2.0/24') # IP 地址和子网掩码
IP 对象的方法和属性 :
ip.len():返回指定子网中的 IP 地址数量。ip.strNormal():返回标准的 IP 地址表示形式。ip.version():返回 IP 地址版本(IPv4 或 IPv6)。ip.reverseName():返回 IP 地址的反向域名。ip.iptype():返回 IP 地址类型(公有、私有等)。
子网的计算 :
make_net():将 IP 地址和子网掩码合并成一个子网。strNetmask():返回子网的掩码字符串形式。strNormal(0):返回子网的正常表示形式。
示例1
#!/usr/bin/env python
# 引入模块
from IPy import IP
ip_s = input('Please input an IP or net-range: ')
ips = IP(ip_s)
print("ips: %s" % ips) #输出IP
if len(ips) > 1:
print('net: %s' % ips.net())
print('netmask: %s' % ips.netmask()) #
print('broadcast: %s' % ips.broadcast())
print('reverse address: %s' % ips.reverseNames()[0]) # 返回 IP 地址的反向域名
print('subnet: %s' % len(ips))
else:
print('reverse address: %s' % ips.reverseNames()[0])
print('hexadecimal: %s' % ips.strHex()) # ip地址值八进制
print('binary ip: %s' % ips.strBin()) # ip地址值二进制
print('iptype: %s' % ips.iptype()) # 返回 IP 地址类型,私有还是公有
print('ip_net: %s' % ips.make_net(24)) # IP是否在子网中
print('ip_version: %s' % ips.version()) # IP地址是V4还是V6, V4返回4
print('ip_mac: %s' % ips.get_mac()) # 获取mac地址
示例2
from IPy import IP
import subprocess
def validate_ip(ip_address):
"""
验证 IP 地址是否合法
"""
try:
IP(ip_address)
print(f"{ip_address} 是一个有效的 IP 地址")
return True
except ValueError:
print(f"{ip_address} 不是一个有效的 IP 地址")
return False
def check_subnet(ip_address, subnet):
"""
检查 IP 地址是否在指定的子网中
"""
try:
ip = IP(ip_address)
if ip in IP(subnet):
print(f"{ip_address} 在子网 {subnet} 中")
return True
else:
print(f"{ip_address} 不在子网 {subnet} 中")
return False
except ValueError:
print(f"{subnet} 不是一个有效的子网")
return False
def count_ip_addresses(subnet):
"""
计算子网中的 IP 地址数量
"""
try:
ip_network = IP(subnet)
count = len(ip_network)
print(f"{subnet} 中共有 {count} 个 IP 地址")
return count
except ValueError:
print(f"{subnet} 不是一个有效的子网")
return -1
def ping_host(ip_address):
"""
使用 ping 命令检查主机是否可达
"""
try:
command = f"ping -c 4 {ip_address}"
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode == 0:
print(f"{ip_address} 主机可达")
return True
else:
print(f"{ip_address} 主机不可达")
return False
except Exception as e:
print(f"检查 {ip_address} 主机可达性时发生错误:{e}")
return False
def reverse_dns_lookup(ip_address):
"""
执行反向 DNS 查询获取 IP 地址的域名
"""
try:
command = f"dig +short -x {ip_address}"
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode == 0:
domain_name = result.stdout.decode('utf-8').strip()
print(f"{ip_address} 的域名为:{domain_name}")
return domain_name
else:
print(f"无法执行反向 DNS 查询获取 {ip_address} 的域名")
return None
except Exception as e:
print(f"执行反向 DNS 查询时发生错误:{e}")
return None
def main():
# 示例 IP 地址和子网
ip_address = '192.168.123.160'
subnet = '192.168.123.0/24'
# 验证 IP 地址是否合法
validate_ip(ip_address)
# 检查 IP 地址是否在指定的子网中
check_subnet(ip_address, subnet)
# 计算子网中的 IP 地址数量
count_ip_addresses(subnet)
# 检查主机可达性
ping_host(ip_address)
# 反向 DNS 查询
reverse_dns_lookup(ip_address)
if __name__ == "__main__":
main()
大概实现了以下功能:
- 验证给定的 IP 地址是否合法。
- 检查指定的 IP 地址是否在给定的子网中。
- 计算给定子网中的 IP 地址数量。
- 使用 ping 命令检查主机的可达性。
- 反向 DNS 查询