【问题标题】:Paramiko: Add host_key to known_hosts permanentlyParamiko:将 host_key 永久添加到 known_hosts
【发布时间】:2017-01-24 04:40:09
【问题描述】:

此代码帮助我建立 ssh 连接。我知道当在known_hosts 中找不到密钥时,set_missing_host_key_policy 会有所帮助。但它的行为不像实际的ssh,因为在我第一次运行此代码后,我假设host_key 将被添加到known_hosts,并且我不再需要函数set_missing_host_key_policy()。但是,我错了(paramiko.ssh_exception.SSHException)。如何使用paramikohost_key 永久添加到known_hosts? (由于后端代码的某些部分是用'C'编写的,因此需要在known_hosts中找到host_key

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

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))

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

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

    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)...
    
    

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

    【讨论】:

    • 这是 ssh。当服务器只允许基本的 sftp 连接时,如何设置 known_hosts?
    【解决方案2】:
    ##使用paramiko远程ssh添加用户
    import paramiko
    import os
    
    ssh= paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('192.168.10.49', port=22,username='root', password='abc@123')
    def addnewuser():
    
        uname=input("Type your new Create userName")
        upass=input("Enter Password")
    
    
    
        os.system("useradd -m -p "+upass+" "+uname)
    
    addnewuser()
    

    【讨论】:

    • 如何回答有关“将 host_key 永久添加到 known_hosts” 的问题?
    【解决方案3】:

    从包文档中比较

    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`.
    

    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.
    

    所以要让 Paramiko 存储任何新的主机密钥,您需要使用 load_host_keys,而不是 load_system_host_keys。例如

    client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
    

    但是避免使用AutoAddPolicy 通常是个好主意,因为它会使您容易受到中间人攻击。我最终做的是在与脚本相同的文件夹中生成本地known_hosts

    ssh -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=./known_hosts user@host
    

    然后加载此文件:

    client.load_host_keys(os.path.join(os.path.dirname(__file__), 'known_hosts'))
    

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

    【讨论】:

    • 如果使用ssh生成known_hosts,基本上和使用AutoAddPolicy生成是一样的(当然我的意思是如果你自己生成然后用脚本分发)。 +1
    • 我发现使用 Path 库更简洁一些:hostkeys = Path.cwd() / 'known_hosts' client.load_host_keys(hostkeys)
    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多