web-dev-qa-db-fra.com

Paramiko: ajouter définitivement Host_key à known_hosts

Ce code m'aide à établir une connexion ssh. Je sais que set_missing_Host_key_policy Aide lorsque la clé n'est pas trouvée dans le known_hosts. Mais il ne se comporte pas comme le ssh, car après la première exécution de ce code, j'ai supposé que le Host_key Serait ajouté à known_hosts Et que j'ai besoin n'ont plus la fonction set_missing_Host_key_policy(). Mais j'avais tort (paramiko.ssh_exception.SSHException). Comment puis-je ajouter de façon permanente le Host_key À known_hosts En utilisant paramiko? (Comme une certaine partie du code principal est écrite en "C" et il faut que le Host_key Se trouve dans known_hosts)

Ou est-ce que je comprends mal quelque chose? J'aurais besoin de conseils à ce sujet ...

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

Dans la documentation du package, comparez

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

avec

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.

Donc, pour que Paramiko stocke toutes les nouvelles clés d'hôte, vous devez utiliser load_Host_keys, Pas load_system_Host_keys. Par exemple.

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

Mais c'est généralement une bonne idée d'éviter d'utiliser AutoAddPolicy, car cela vous rend ouvert aux attaques man-in-the-middle. J'ai fini par générer un known_hosts Local dans le même dossier que le script:

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

puis chargez ce fichier à la place:

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

De cette façon, je peux distribuer le known_hosts Avec mon script et l'exécuter sur différentes machines sans toucher aux hôtes connus réels sur ces machines.

15
danmichaelo

Si vous souhaitez ajouter une clé spécifique lors de l'exécution (sans aucun fichier):

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

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

2
Ramon Medeiros
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()
1
Ganesh Jat