Paramiko:永久地将host_key添加到known_hosts

nid*_*dHi 10 python ssh paramiko

这段代码可以帮我建立一个shh连接.我知道set_missing_host_key_policy在没有找到密钥时会有所帮助known_hosts.但它的行为并不像实际的那样ssh,因为在我第一次运行这段代码之后,我认为它host_key会被添加到known_hosts并且我不再需要该函数set_missing_host_key_policy()了.但是,我错了(paramiko.ssh_exception.SSHException).我怎样才能永久添加host_keyknown_hosts使用paramiko?(由于后端代码的某一部分是用'C'编写的,因此需要host_key找到它known_hosts)

还是我误解了什么?我需要一些指导......

import paramiko

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=str(host),username =str(user),password=str(pswd))
Run Code Online (Sandbox Code Playgroud)

dan*_*elo 15

从包文档中,进行比较

client.load_system_host_keys(filename=None)

Load host keys from a system (read-only) file.  Host keys read with
this method will not be saved back by `save_host_keys`.
Run Code Online (Sandbox Code Playgroud)

client.load_host_keys(filename)

Load host keys from a local host-key file.  Host keys read with this
method will be checked after keys loaded via `load_system_host_keys`,
but will be saved back by `save_host_keys` (so they can be modified).
The missing host key policy `.AutoAddPolicy` adds keys to this set and
saves them, when connecting to a previously-unknown server.
Run Code Online (Sandbox Code Playgroud)

因此,要使Paramiko存储任何新的主机密钥,您需要使用load_host_keys,而不是load_system_host_keys.例如

client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
Run Code Online (Sandbox Code Playgroud)

但是避免使用通常是一个好主意AutoAddPolicy,因为它会让你对中间人攻击持开放态度.我最终做的是known_hosts在与脚本相同的文件夹中生成一个本地:

ssh -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=./known_hosts user@host
Run Code Online (Sandbox Code Playgroud)

然后加载此文件:

client.load_host_keys(os.path.join(os.path.dirname(__file__), 'known_hosts'))
Run Code Online (Sandbox Code Playgroud)

这样我就可以known_hosts与我的脚本一起分发并在不同的机器上运行它,而无需触及这些机器上的实际known_hosts.


Ram*_*ros 5

如果你想在运行时添加一个特定的键(没有任何文件):

from paramiko import RSAKey
from paramiko.py3compat import decodebytes

client = SSHClient()

# known host key
know_host_key = "<KEY>"
keyObj = RSAKey(data=decodebytes(know_host_key.encode()))

# add to host keys
client.get_host_keys().add(hostname=HOST, keytype="ssh-rsa", key=keyObj)

# login to ssh hostname
client.connect(hostname=HOST, port=PORT, username=USER)...

Run Code Online (Sandbox Code Playgroud)

来源:https : //github.com/paramiko/paramiko/blob/2.6.0/tests/test_hostkeys.py#L75-L84