Python+Linux通过SSH连接Windows执行命令的方法及问题排查
让我们一步步来解决你遇到的两个问题——ssh2命令执行mkdir返回exit 53,以及paramiko库的主机密钥异常。
一、解决ssh2命令执行mkdir返回exit 53的问题
你提到手动登录Windows SSH没问题,手动创建目录也正常,但通过ssh2命令执行就失败,exit 53通常和路径解析错误有关,核心原因是Unix Shell会把Windows路径里的反斜杠(\)当成转义字符,导致实际传递给Windows的路径被篡改了。
试试这几种修改方式:
1. 用正斜杠替换反斜杠(Windows原生支持正斜杠作为路径分隔符)
把命令里的C:\Temp\ALEX_TEST_EX改成C:/Temp/ALEX_TEST_EX,完整命令:
/usr/bin/ssh2 --password pass -l admin ip_address mkdir "C:/Temp/ALEX_TEST_EX"
2. 在Unix Shell中转义反斜杠
把每个反斜杠换成双反斜杠,让Shell不解析它,完整命令:
/usr/bin/ssh2 --password pass -l admin ip_address mkdir "C:\\Temp\\ALEX_TEST_EX"
3. 用单引号包裹路径
单引号会让Unix Shell完全忽略内部的转义字符,直接把原路径传递给Windows:
/usr/bin/ssh2 --password pass -l admin ip_address mkdir 'C:\Temp\ALEX_TEST_EX'
额外验证建议:登录Windows SSH后,手动执行mkdir "C:\Temp\ALEX_TEST_EX"确认是否能成功,确保父目录C:\Temp确实存在(如果不存在,需要先创建它,Windows的mkdir默认不支持递归创建,得先建Temp再建子目录)。
二、解决paramiko的Server 'X.Y.Z.W' not found in known_hosts异常
这个错误是因为paramiko默认会检查本地~/.ssh/known_hosts文件,而你的Windows主机密钥还没被添加到这个文件里。有三种解决方式:
1. 手动添加主机密钥到known_hosts
在Unix终端执行以下命令,第一次登录时输入yes确认添加主机密钥:
ssh admin@X.Y.Z.W
这样主机密钥就会自动保存到~/.ssh/known_hosts,之后paramiko就能正常识别了。
2. 在paramiko中禁用主机密钥检查(仅测试环境用)
如果是测试场景,可以临时禁用主机密钥验证,添加AutoAddPolicy()策略:
import paramiko # 创建SSH客户端实例 client = paramiko.SSHClient() # 设置自动添加未知主机密钥的策略 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接Windows主机 client.connect('X.Y.Z.W', username='admin', password='pass') # 执行mkdir命令(推荐用正斜杠路径避免转义问题) stdin, stdout, stderr = client.exec_command('mkdir "C:/Temp/ALEX_TEST_EX"') # 打印命令输出和错误信息 print("命令输出:", stdout.read().decode('utf-8')) print("错误信息:", stderr.read().decode('utf-8')) # 关闭连接 client.close()
⚠️ 注意:这种方式在生产环境不安全,会暴露给中间人攻击风险,仅用于测试场景。
3. 指定自定义known_hosts文件路径
如果你的known_hosts文件不在默认的~/.ssh/known_hosts位置,可以手动加载:
client = paramiko.SSHClient() client.load_host_keys('/path/to/your/known_hosts') client.connect('X.Y.Z.W', username='admin', password='pass')
内容的提问来源于stack exchange,提问作者user9280049

