如何在Paramiko的connect方法中正确替换主机名变量?
在Paramiko的connect方法中正确使用变量主机名的解决方案
我来帮你搞定这个Paramiko变量传递的问题!你遇到的核心问题应该是调用connect方法时,错误地把变量当成字符串字面量处理了(比如不小心给变量名加了引号),导致Paramiko直接把变量名本身当作主机名去连接,而不是变量存储的实际主机地址。
下面是具体的解决思路和修正后的代码:
关键注意点
- 确保你从JSON中读取的
host_data包含正确的主机名字段(比如host_data["hostname"],具体键名要和你的JSON结构对应) - 调用
connect时直接传入变量,不要给变量名加引号,否则会被识别成字面字符串
修正后的完整代码示例
import paramiko import json def exec_commands(host_data): # 从传入的host_data中提取主机名,这里假设JSON里的键是"hostname",根据你的实际结构调整 hostname = host_data["hostname"] # 其他必要参数,比如用户名、密码,也从host_data里提取(示例用占位符,你要换成实际键名) username = host_data["username"] password = host_data["password"] new_client = paramiko.SSHClient() new_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 这里直接传变量hostname,不要加引号! new_client.connect(hostname=hostname, username=username, password=password) # 执行命令示例 stdin, stdout, stderr = new_client.exec_command("uname -a") print(stdout.read().decode()) # 记得关闭连接 new_client.close() # 从JSON文件读取主机数据的示例 with open("hosts.json", "r") as f: hosts = json.load(f) # 遍历主机数据(对应你用iter()的场景) for host in hosts: exec_commands(host)
常见错误排查
如果你还是遇到问题,可以检查这几点:
- 打印
hostname变量,确认它的值是正确的主机地址,而不是空值或者错误的字符串 - 检查
connect方法的参数是否正确,比如有没有把hostname参数写成了字符串字面量(比如错误写法:new_client.connect(hostname="hostname"),这会去连接名为"hostname"的主机) - 确认JSON文件的结构正确,比如每个主机条目都包含你要提取的字段
内容的提问来源于stack exchange,提问作者Raja G
相关产品推荐
相关产品推荐

