端口输入验证函数因缺少显式返回布尔值,隐式返回None导致逻辑中断,后续判断无法正常执行。修复需在函数末尾添加returnresult,同时将递归调用改为returnget_port(),以确保正确传递并返回验证结果。
在构建端口扫描器的过程中,用户输入的端口格式五花八门:可能是单个端口如 80,也可能是范围如 20-25,或者列表如 22,80,443。这些输入必须经过严格校验才能被正确解析。你给出的代码中,get_port() 函数依赖 port_is_valid(str_ports) 的返回值来决定执行方向,但问题恰恰出在这里——port_is_valid 函数没有显式返回布尔结果。
Python 有一个“潜规则”:如果函数末尾没有 return 语句,它会隐式返回 None。而 if port_is_valid(str_ports): 实际上等同于 if None:,布尔值永远是 False。这就导致整个验证逻辑被直接跳过——无论你输入的是 80 还是 abc,程序都会静默地走向 else 分支(而这里甚至没有处理逻辑),最终 get_port() 返回 None。整个流程就此中断。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
要修复这个问题,核心只有一句话:在 port_is_valid 中显式返回 result。
import re
import termcolor
port_regex = re.compile(r'^\d{1,5}(-\d{1,5})$|^\d{1,5}(,\d{1,5})*$') # 优化正则:更精准匹配范围与列表
def port_is_valid(port):
result = bool(port_regex.match(port.strip())) # 增加 .strip() 防空格干扰
print(f"Port validation result: {result}")
return result # ← 关键修复:必须返回布尔值!
另外,get_port() 内部递归调用自身后,如果忘记返回其结果,上层调用依然会得到 None。所以还需要把递归调用改为 return get_port()。完整的修复版本如下:
def get_port():
str_ports = input(termcolor.colored("Specify The Ports (e.g., 22,80 or 1-1024): ", "light_cyan")).strip()
print(f"Raw input: '{str_ports}'")
if not str_ports:
print(termcolor.colored("Error: Input cannot be empty.", "red"))
return get_port()
if port_is_valid(str_ports):
if "," in str_ports:
try:
int_ports = [int(p.strip()) for p in str_ports.split(",")]
# 验证每个端口范围:1–65535
if all(1 <= p <= 65535 for p in int_ports):
print(" Comma-separated ports parsed.")
return int_ports
else:
print(termcolor.colored("Error: Port numbers must be between 1 and 65535.", "red"))
return get_port()
except ValueError:
print(termcolor.colored("Error: Invalid number format in list.", "red"))
return get_port()
elif "-" in str_ports:
parts = str_ports.split("-")
if len(parts) != 2:
print(termcolor.colored("Error: Range format must be 'start-end'.", "red"))
return get_port()
try:
start, end = int(parts[0].strip()), int(parts[1].strip())
if not (1 <= start <= 65535 and 1 <= end <= 65535):
print(termcolor.colored("Error: Range values must be between 1 and 65535.", "red"))
return get_port()
if start > end:
print(termcolor.colored("Error: Start port must not exceed end port.", "red"))
return get_port()
f_ports = list(range(start, end + 1))
print(" Port range parsed.")
return f_ports
except ValueError:
print(termcolor.colored("Error: Invalid number in range.", "red"))
return get_port()
else:
try:
port = int(str_ports)
if 1 <= port <= 65535:
print(" Single port parsed.")
return port
else:
print(termcolor.colored("Error: Port must be between 1 and 65535.", "red"))
return get_port()
except ValueError:
print(termcolor.colored("Error: Invalid single port number.", "red"))
return get_port()
else:
print(termcolor.colored("Error: Invalid port format. Use e.g., '80', '22,80,443', or '1-1024'.", "red"))
return get_port()
True 或 False,不能依赖隐式 None。get_port() 内部递归调用自己时,一定要用 return get_port(),否则栈顶调用的结果会丢失。.strip() 消除首尾空格,避免正则匹配因为多了一个空格而失败。123, 或 123- 这类不完整输入),上面已经替换为更严谨的表达式。最后,调用示例非常简单:
ports = get_port()
print(f"Final ports: {ports}") # 确保输出非 None
经过以上修补,端口输入模块就能稳定返回 int、list[int] 或触发重试,彻底解决 None 导致流程中断的问题。后续的扫描逻辑拿到可靠的端口数据,才能安心跑下去。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述