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