使用 Cygwin OpenSSH 在 Windows 上的 Paramiko 找不到 known_hosts 文件

Posted

技术标签:

【中文标题】使用 Cygwin OpenSSH 在 Windows 上的 Paramiko 找不到 known_hosts 文件【英文标题】:Paramiko on Windows with Cygwin OpenSSH doesn't find known_hosts files 【发布时间】:2019-04-04 12:03:35 【问题描述】:

我有一个设置,我想通过带有私钥/公钥的无密码 SSH 从 Windows7 虚拟机连接到 Linux 服务器。

SSH 连接通过 Cygwin 终端正常工作。

使用 Paramiko,如果我接受缺少的主机密钥,我可以从我的客户端连接到我的主机,但如果我尝试使用 known_hosts 代替,我会收到错误:

在 known_hosts 中找不到服务器 XXX。

Paramiko 是否能够在 Windows/Cygwin 中读取 known_hosts 文件?我能以某种方式提供路径吗?

我的.ssh 文件夹位于C:\cygwin64\home\<user>\.ssh 下。

非常感谢您的帮助, 托马斯

【问题讨论】:

请注意,“无密码连接”“known_hosts文件”无关。 你的 cygwin .ssh 文件夹在哪里? 你好马丁,谢谢你的回答。我意识到无密码与它无关,我只是提到它,因为它是我的实际用例。否则我可以使用我当前的设置,自动添加丢失的主机文件并提供密码。如果我只自动添加丢失的主机文件而不提供密码,我会收到“没有可用的身份验证方法”错误。 我的 .ssh 文件夹位于 C:\cygwin64\home\\.ssh 【参考方案1】:

我假设您使用的是SSHClient.load_system_host_keys

默认情况下,这些方法会加载os.path.expanduser('~/.ssh/known_hosts') 文件。与您的C:\cygwin64\home\<user>\.ssh 位置不匹配的内容,如在Windows 上os.path.expanduser 使用USERPROFILE 环境变量,它指向C:\Users\<user>


您可以通过以下方式解决此问题:

以某种方式更改 Cygwin 配置(但它可能会破坏其他东西); 或创建从C:\Users\<user>\.sshC:\cygwin64\home\<user>\.ssh 的目录连接(可能是最便携的解决方案); 或在对SSHClient.load_system_host_keys 的调用中明确指定filename 参数(不可移植); 或在运行 Python 脚本之前将 HOME 环境变量设置为指向 C:\cygwin64\home\<user> - os.path.expanduser 更喜欢 HOME 而不是 USERPROFILE - Windows 不使用 HOME(可能会破坏其他东西)。

【讨论】:

创建目录连接不起作用,因为路径扩展为 'C:\\Users\\/.ssh/known_hosts',所以我最终直接提供了文件名。由于 Paramiko 对私钥文件有同样的问题,因此必须设置 key_filename 参数以提供私钥位置。感谢您的帮助,现在可以正常使用了 好的。虽然我仍然不明白为什么目录连接不起作用。

以上是关于使用 Cygwin OpenSSH 在 Windows 上的 Paramiko 找不到 known_hosts 文件的主要内容,如果未能解决你的问题,请参考以下文章

cygwin openssh for windows

如何在Cygwin中安装并配置SSH

安装 openssh >=v8.2

sh Cygwin GPG代理转发脚本(与Gpg4Win 3一起使用,需要openssh和ssh-pageant)

为啥连接 Cygwin 的 OpenSSH 服务器的用户名是 <hostname>+<username> 格式?

如何在 Cygwin 上下载 SCP 和 ssh?