如何实现提示用户输入IP/FQDN/主机名并完成校验与DNS解析
实现方案
你原来的代码存在两处明显错误:一是input()的参数仅支持传入提示字符串,把ipaddress.ip_address嵌套进输入参数的写法完全错误;二是没有做输入类型判断和分支处理逻辑,完整实现方式如下:
实现步骤
- 导入依赖库:用
ipaddress库做IP有效性校验,用socket库做域名解析、主机名转FQDN处理 - 获取用户输入后先做空值、前后空格的基础校验
- 优先尝试校验输入是否为合法IP,校验通过直接使用
- 非IP的输入先通过
socket.getfqdn()获取完整FQDN,短主机名会自动基于本地DNS配置补全后缀 - 解析得到的FQDN再通过
socket.gethostbyname()获取对应IP地址 - 对无效输入、解析失败的场景做异常捕获和提示
完整可运行代码
import ipaddress import socket def process_host_input(): # 获取用户输入 user_input = input("Enter IP, FQDN, or Host: ").strip() if not user_input: raise ValueError("输入不能为空") # 优先判断是否为合法IP try: valid_ip = ipaddress.ip_address(user_input) print(f"输入为合法IP地址:{valid_ip}") return {"type": "ip", "raw_input": user_input, "ip": str(valid_ip)} except ValueError: # 不是IP,进入主机名/FQDN处理逻辑 pass # 处理主机名/FQDN try: # 自动补全短主机名为完整FQDN,本身是FQDN则直接返回 fqdn = socket.getfqdn(user_input) # 解析FQDN对应的IP resolved_ip = socket.gethostbyname(fqdn) if fqdn == user_input: print(f"输入为合法FQDN:{fqdn},解析IP为:{resolved_ip}") return {"type": "fqdn", "raw_input": user_input, "fqdn": fqdn, "ip": resolved_ip} else: print(f"输入为主机名:{user_input},补全FQDN为:{fqdn},解析IP为:{resolved_ip}") return {"type": "hostname", "raw_input": user_input, "fqdn": fqdn, "ip": resolved_ip} except socket.gaierror: raise ValueError(f"解析失败:{user_input},请检查输入或本地DNS配置") # 调用示例 if __name__ == "__main__": try: result = process_host_input() # 后续业务直接读取result内的对应字段即可 print("最终处理结果:", result) except Exception as e: print("处理错误:", e)
关键逻辑说明
ipaddress.ip_address原生支持IPv4、IPv6的合法性校验,无需自己写正则匹配socket.getfqdn()会自动读取本地resolv.conf(Linux)或网络配置(Windows)里的DNS搜索后缀,补全短主机名,返回值和输入值一致就说明输入本身就是FQDN- 所有异常场景都抛出明确的错误提示,方便排查问题
内容的提问来源于stack exchange,提问作者CrossingTheRoad2020
相关产品推荐
相关产品推荐

