我的脚本有一点问题,我需要将表单'xxx.xxx.xxx.xxx'中的ip转换为整数表示,然后从此表单返回.
def iptoint(ip):
return int(socket.inet_aton(ip).encode('hex'),16)
def inttoip(ip):
return socket.inet_ntoa(hex(ip)[2:].decode('hex'))
In [65]: inttoip(iptoint('192.168.1.1'))
Out[65]: '192.168.1.1'
In [66]: inttoip(iptoint('4.1.75.131'))
---------------------------------------------------------------------------
error Traceback (most recent call last)
/home/thc/<ipython console> in <module>()
/home/thc/<ipython console> in inttoip(ip)
error: packed IP wrong length for inet_ntoa`
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?
给定两个CIDR地址为192.168.2.0/14和192.168.2.0/32
如何在"python2.6"中检查两个ip地址是否重叠?
我已通过netaddr,它允许检查192.168.2.0是否在CIDR地址192.168.2.0/14中
from netaddr import IPNetwork, IPAddress
bool = IPAddress("192.168.2.0") in IPNetwork("192.168.2.0/14"):
Run Code Online (Sandbox Code Playgroud)
但是如何检查两个CIDR地址?
我找到了一个引用:: 如何在python中检查ip是否在网络中
在我的 Python 应用程序中,我有一个 IP 地址字符串数组,如下所示:
[
"50.28.85.81-140", // Matches any IP address that matches the first 3 octets, and has its final octet somewhere between 81 and 140
"26.83.152.12-194" // Same idea: 26.83.152.12 would match, 26.83.152.120 would match, 26.83.152.195 would not match
]
Run Code Online (Sandbox Code Playgroud)
我安装了netaddr,虽然文档看起来很棒,但我无法理解它。这一定非常简单 - 如何检查给定的 IP 地址是否与这些范围之一匹配?不需要netaddr特别使用 - 任何简单的 Python 解决方案都可以。
我有一个包含用户及其 IP 地址的 pandas 数据框:
users_df = pd.DataFrame({'id': [1,2,3],
'ip': ['96.255.18.236','105.49.228.135','104.236.210.234']})
id ip
0 1 96.255.18.236
1 2 105.49.228.135
2 3 104.236.210.234
Run Code Online (Sandbox Code Playgroud)
以及一个包含网络范围和相应地理名称 ID 的单独数据框:
geonames_df = pd.DataFrame({'network': ['96.255.18.0/24','105.49.224.0/19','104.236.128.0/17'],
'geoname': ['4360369.0','192950.0','5391959.0']})
geoname network
0 4360369.0 96.255.18.0/24
1 192950.0 105.49.224.0/19
2 5391959.0 104.236.128.0/17
Run Code Online (Sandbox Code Playgroud)
对于每个用户,我需要根据所有网络检查他们的 IP,并提取相应的地理名称并将其添加到users_df. 我想要这个作为输出:
id ip geonames
0 1 96.255.18.236 4360369.0
1 2 105.49.228.135 192950.0
2 3 104.236.210.234 5391959.0
Run Code Online (Sandbox Code Playgroud)
在这个例子中很简单,因为它们的顺序正确并且只有 3 个示例。实际上users_df有 4000 行,geonames_df超过 300 万
我目前正在使用这个:
import ipaddress
networks = []
for …Run Code Online (Sandbox Code Playgroud) 鉴于:
172.17.0.0/16)172.17.0.2/16)如果B在A中怎么说?
所有地址都是以下列形式的字符串变量:[IP address in dot-decimal notation]/[subnet mask].我应该尝试通过操纵字符串(初步想法)来做到这一点.有不同的路径吗?
以下是Python的相同问题:
Go的另一种方法:
我知道这里有一些类似的问题,但是他们大多想要找到范围本身(它使用一些库,比如stackoverflow说的是我的问题的一个例子),并且是另一种语言.
我有办法将子网转换为子网中ip的范围的开头和结尾(好吧,措辞不好,就像1.1.1.1/16 -> (1.1.0.0 , 1.1.255.255))
我现在想检查是否1.1.2.2在此子网内.我可以简单地做一个>和<比较?
ip_range = ('1.1.0.0', '1.1.255.255')
if '1.1.2.2' >= ip_range[0] and '1.1.2.2' <= ip_range[1]:
return True
Run Code Online (Sandbox Code Playgroud)
当我测试它时,它可以工作,但我不知道它是否总能用于任何ipv4 ip.我假设我只是比较ASCII顺序,所以这应该总是有效,但有没有例外?
是否有任何方法可以检查网络范围内的某些IP地址是否存在于另一个IP范围的子网中?
Example: 10.0.1.0/18 in 123.1.0.0/8
Run Code Online (Sandbox Code Playgroud)
如果它存在,我需要它返回True,否则返回False.
python ×7
ip-address ×5
ip ×3
networking ×2
subnet ×2
cidr ×1
compare ×1
go ×1
pandas ×1
python-3.x ×1