验证用户是否在提示时输入了 ip 地址或 CIDR 表示法

validating if a user entered an ip address or CIDR notation when prompted

我正在使用 python 中的 ipaddress 模块。这是我目前的情况。我们有各种自助服务门户,可以提示用户输入 IP 地址。我们将允许它成为一个单独的 IP,例如 165.136.219.5 或类似 165.136.219.0/24 的东西。输入数据后,我希望我的代码检查并确保它是有效的 IPV4 地址或有效的 IPV4 CIDR。

当我执行类似下面这段代码的操作时,出现“/”不是有效字符的错误。我使用的 ipaddress 包错了吗?

newIpAddress = input("Please enter the IP address for SFTP access: ")
if ipaddress.IPv4Address(newIpAddress) == True or ipaddress.IPv4Network(newIpAddress) == True:

我基本上是从最终用户那里获取输入,然后我想使用一个 if 语句基本上说明只要它是一个有效的 IPV4 IP 或一个有效的 IPV4 CIDR 然后去做一些任务,然后我做一些其他的打印出一些关于不满足地址或网络要求的冗长语句。

我当前的代码出现以下错误:

“165.136.219.0/24”中出现意外的“/” 文件“C:\Users\myname\Documents\my_Scripts\PaloAlto\sftpNew.py”,第 21 行,位于 如果 ipaddress.IPv4Address(newIpAddress) == True 或 ipaddress.IPv4Network(newIpAddress) == True:

ipaddress class 似乎没有提供任何方便的方法来确定一个字符串是代表有效的 IPv4 地址还是代表有效的 IPv4 网络还是既不是有效的地址也不是网络。

但是,您可以构建自己的基本功能来检查一个或另一个是否抛出异常和 return truefalse 并在您的条件中使用它:

import ipaddress
def valid_ip_or_cidr(ip):
    try:
        ipaddress.IPv4Address(ip)
        print('valid as address')
        return True
    except:
        try:
            ipaddress.IPv4Network(ip)
            print('valid as network')
            return True
        except:
            print('invalid as both an address and network')
            return False

        
valid_ip_or_cidr('192.168.1.1')
# valid as address
# True
valid_ip_or_cidr('192.168.1.0/24')
# valid as network
# True
valid_ip_or_cidr('foo')
# invalid as both an address and network
# False

在您的上下文中,这将在您的条件中实现为:

newIpAddress = input("Please enter the IP address for SFTP access: ")
if valid_ip_or_cidr(newIpAddress):
    # code to execute if validation succeeds