【问题标题】:Get host key of an ssh server in base 64以 base 64 获取 ssh 服务器的主机密钥
【发布时间】:2015-10-01 23:01:24
【问题描述】:

我正在使用 paramiko,并且我需要 base 64 中的 ssh 服务器的主机密钥用于以下行:

key = paramiko.RSAKey(data=base64.decodestring('...'))

有没有人知道通过 Mac OS X 终端、python 脚本或其他方式找到这个的方法?谢谢

【问题讨论】:

  • 我很想知道为什么您需要 ssh 服务器的主机密钥。在上面的sn-p中,你打算用key做什么?
  • 指定密钥是一种从客户端验证服务器就是他们所说的身份的方法。 (即不是中间人攻击。)

标签: python macos ssh terminal paramiko


【解决方案1】:
>>> from paramiko.client import SSHClient

>>> client = SSHClient()
>>> client.connect('hostname')
# This probably will fail since there's no auth set here
>>> rsa_key = client.get_transport().get_remote_server_key()
<paramiko.rsakey.RSAKey object at 0x109305e90>
# however, this still exists
>>> rsa_key.get_base64()
u'AAAAB3NzaC1y...Nhd'

由于您已经在使用 paramiko,您可能只想在 rsa_key 处停止,而不是使用 get_base64() 创建新的,因为 rsa_key 已经是 RSAKey 类型。

服务器也可以定义一个(或多个)非 RSA 密钥,但如果您知道它只返回 RSA,那么显然总是会返回 RSA。这取决于协商的密钥。

【讨论】:

  • 你能帮我弄清楚为什么会出现这个错误'NoneType' object has no attribute 'get_remote_server_key'
  • 这意味着 client.get_transport() 没有响应 Transport 对象。这很可能意味着 client.connect 失败——在这种情况下会引发异常。
【解决方案2】:

您可以从服务器本身检索服务器的公钥,而无需对服务器进行身份验证。

import paramiko
import socket
import sys

for arg in sys.argv[1:]:
        sock = socket.socket()
        sock.connect((arg, 22))
        trans = paramiko.transport.Transport(sock)
        trans.start_client()
        k = trans.get_remote_server_key()
        # On my machine, this returns a paramiko.RSAKey
        print k.get_base64()

【讨论】:

  • 我认为您可能会使用 arg 来决定连接到哪个服务器,而不是静态连接到 localhost。
  • 当我把它放到我的代码中时,它似乎至少完全跳过了 print 语句,甚至可能更多。然后它继续调用 key = paramiko.RSAKey(data=base64.decodestring(k.get_base64())) 上的错误
  • @PhoenixRising 1) 我怀疑您在程序中包含了for 语句。 for 语句迭代这个非常短的程序的命令行参数。你可能不希望那样。删除for 行并相应地调整缩进。 2)你提到的赋值行写得更简单:key = k.
  • 如果我删除for 行,你建议我如何处理这行:sock.connect((arg, 22))
  • @PhoenixRising - 将 arg 替换为服务器的名称或 IP 地址。
【解决方案3】:

您只需要这样做一次,还是需要能够在运行时以编程方式获取主机密钥?如果只有一次,

ssh -v <hostname> 

将显示主机密钥。

【讨论】:

  • 这将显示指纹但不显示密钥——它基于密钥但不是密钥。
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 2012-09-11
  • 1970-01-01
  • 2015-11-15
  • 2011-06-23
  • 1970-01-01
  • 2018-09-13
  • 2018-05-01
相关资源
最近更新 更多