Paramiko连接时报错TypeError: getaddrinfo()参数1需为字符串或None
问题排查结果
核心错误是传入的IP地址类型不符合要求:
- 你调用
ip_address()验证用户输入的IP合法性之后,返回的是ipaddress模块的IPv4Address/IPv6Address类型对象,并非字符串格式的IP - Paramiko的
SSHClient.connect()方法第一个参数要求传入字符串格式的主机地址/域名,你直接传入IP地址对象后,底层调用系统getaddrinfo函数时参数类型不匹配,就触发了对应的TypeError - 后续拼接命令输入提示符
username + "@" + server时,也会因为server不是字符串出现类型错误
修复方案
只需要在使用server变量的位置转为字符串即可,另外建议补充Paramiko的主机密钥校验配置,避免首次连接陌生主机时报错,修改后完整代码如下:
from paramiko import SSHClient, AutoAddPolicy from ipaddress import ip_address from stdiomask import getpass ssh = SSHClient() # 自动添加未知主机密钥,避免首次连接报错 ssh.set_missing_host_key_policy(AutoAddPolicy()) try: server = ip_address(input("Enter IP of server: ")) except ValueError: print("This isn't an IP address...") except: print("Enter something...") else: username = input("Enter the username: ") password = getpass("Enter the password: ") # 把server转为字符串传入connect方法 ssh.connect(str(server), port=22, username=username, password=password) # 拼接提示符时也把server转为字符串 command = input(f"{username}@{str(server)}: ") ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(command) # 可补充打印命令执行结果验证功能 print(ssh_stdout.read().decode())
你也可以在验证IP合法后直接把转成字符串的IP存为变量,后续使用时无需重复转换:
try: server_ip_obj = ip_address(input("Enter IP of server: ")) server = str(server_ip_obj) # 后续异常和业务逻辑不变
内容的提问来源于stack exchange,提问作者itsmii
相关产品推荐
相关产品推荐

