在 Paramiko 中使用 ssh_config 文件
Posted
技术标签:
【中文标题】在 Paramiko 中使用 ssh_config 文件【英文标题】:Using ssh_config file with Paramiko 【发布时间】:2019-10-19 20:53:29 【问题描述】:我需要使用 SSH 连接到服务器来下载文件。我有 Ubuntu,并且我已经以标准方式设置了 SSH:我在 .ssh
中有一个 ssh_config
文件,它为服务器地址 (Hostname.com
) 和用户名定义了一个主机条目 (比如 host_key
),以及我已经设置了一个 RSA 密钥。所以当我尝试从命令行或bash登录SSH时,我只需要使用ssh host_key
我想在 Python 中执行此操作。标准解决方案似乎是使用 Paramiko 来建立连接。我试过这个:
from paramiko import SSHClient
from scp import SCPClient
ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('host_key')
scp = SCPClient(ssh.get_transport())
# etc...
但是,它似乎总是在ssh.connect('host_key')
上挂起并超时。即使我尝试包含用户名和密码:ssh.connect('host_key', username='usrnm', password='pswd')
。
我的主机密钥没有正确加载吗?这也会处理 RSA 密钥吗?
只有当我使用带有用户名和输入密码的整个 Hostname.com
时它才有效。这可能有点不安全。
【问题讨论】:
您是否希望 Paramiko 读取本地.ssh/ssh_config
文件并为您的主机查找“host_key”配置条目?你的配置文件是什么样的?
好吧,这就是我认为它会做的事情。我以为ssh.load_system_host_keys()
做到了,尽管我承认我对此并没有太多经验。我的配置文件有一个主机名条目,类似于Host host_key Hostname host.name.com User username ServerAliveInterval 60 IdentityFile ~/.ssh/id_rsa_hostkey
。那么有没有一种方法可以登录而无需以明文形式输入密码作为 ssh.connect
的参数?根据在线指南,情况似乎如此。
你真的要使用ssh_config
吗?还是您更愿意直接在 Python 代码中指定所有信息?
我有什么理由不应该使用 ssh_config 以及有哪些替代方案?我只是认为这样做会更好,因为它更容易(如果可能的话)。通过直接指定所有信息,您的意思是 rsa_key 和东西的位置吗?我想这也可以。但我觉得有一个 python 代码文件是一个坏主意,我需要在其中输入我的 ssh 服务器密码。
【参考方案1】:
我认为将ssh_config
文件与 Paramiko(或任何其他代码/语言)一起使用并不常见。 ssh_config
是 OpenSSH 工具的配置文件,一般不用于 SSH。
通常,您直接在代码中指定您的私钥作为SSHClient.connect
方法的参数:How to access to a remote server using Paramiko with a public key-file
如果你想继续使用ssh_config
,Paramiko 可以解析它。检查parse_ssh_config
和lookup_ssh_host_config
函数。但我相信,您仍然需要从配置中查找密钥文件并将其显式传递给SSHClient.connect
方法。
【讨论】:
【参考方案2】:由于paramiko
有一个SSHConfig class,您可以将它用于您的~/.ssh/config
。
但是,这有点麻烦,我建议您使用fabric 而不是那个。
下面是代码示例:
from fabric.api import put
put('local path', 'remote path')
【讨论】:
以上是关于在 Paramiko 中使用 ssh_config 文件的主要内容,如果未能解决你的问题,请参考以下文章
ssh配置文件ssh_config和sshd_config区别