Skip to main content

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()

大概实现了以下功能:

  1. 验证给定的 IP 地址是否合法。
  2. 检查指定的 IP 地址是否在给定的子网中。
  3. 计算给定子网中的 IP 地址数量。
  4. 使用 ping 命令检查主机的可达性。
  5. 反向 DNS 查询