
Paramiko 不支持直接解析 OpenSSH 命令行语法(如 -p55555),需显式通过 port= 参数传入端口号,而非将其拼接在主机名中。
paramiko 不支持直接解析 openssh 命令行语法(如 `-p55555`),需显式通过 `port=` 参数传入端口号,而非将其拼接在主机名中。
在使用 Paramiko 建立 SSH 连接时,常见的误区是将 OpenSSH 命令(如 ssh user@host -p55555)中的 -p 选项错误地理解为“主机名的一部分”,进而尝试将 -p55555 直接写入 hostname 字段,例如:
# ❌ 错误示例:不要把 -p55555 当作 hostname 的一部分 ssh.connect(hostname='XXX.XXX.XXX.XXX -p55555', username='ID', password='your_password')
这会导致连接失败(如 Name or service not known 或 Connection refused),因为 Paramiko 会尝试解析含空格和短横的字符串为合法域名或 IP,而非识别其为端口指令。
✅ 正确做法是:将主机地址、端口、用户名、密码作为独立参数传入 connect() 方法,其中端口通过 port= 显式指定(默认为 22):
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自动接受未知主机密钥(仅用于测试环境)
# ✅ 正确:分离 hostname 和 port
ssh.connect(
hostname='XXX.XXX.XXX.XXX',
port=55555, # 注意:此处为整数类型,不是字符串
username='ID',
password='your_password'
)
# 示例:执行简单命令
stdin, stdout, stderr = ssh.exec_command('uptime')
print(stdout.read().decode())
ssh.close()
⚠️ 注意事项:
-
port参数必须为 整数(如55555),不能传字符串'55555'; - 生产环境中应避免硬编码密码,推荐使用密钥认证(
key_filename或pkey参数); -
AutoAddPolicy()存在安全风险,正式部署建议改用RejectPolicy()并预先加载可信主机密钥; - 若使用私钥登录且密钥有密码,需通过
paramiko.RSAKey.from_private_key_file()加载并传入pkey参数。
总结:Paramiko 是纯 Python 实现的 SSH 协议库,不兼容 OpenSSH 命令行语法解析。所有连接参数(包括端口、认证方式、超时等)都必须以明确的关键字参数形式提供,这是其设计原则,也是确保连接健壮性和可维护性的基础。










