Paramiko: Agregar host_key a known_hosts permanentemente

Este código me ayuda a hacer una conexión shh. Sé que set_missing_host_key_policy ayuda cuando la clave no se encuentra en el known_hosts . Pero no se comporta como el ssh real, porque después de la primera vez que ejecuto este código, asumí que la host_key se agregaría a known_hosts y que ya no necesito tener la función set_missing_host_key_policy() . Pero, estaba equivocado (paramiko.ssh_exception.SSHException) . ¿Cómo puedo agregar de forma permanente la host_key a known_hosts usando paramiko ? (Como una parte determinada del código de fondo se escribe en ‘C’ y necesita que se encuentre la known_hosts en known_hosts )

O estoy malinterpretando algo? Necesitaría alguna orientación sobre esto …

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

De la documentación del paquete, compare

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

con

 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. 

Así que para hacer que Paramiko almacene cualquier nueva clave de host, necesita usar load_host_keys , no load_system_host_keys . P.ej

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

Pero , en general, es una buena idea evitar el uso de AutoAddPolicy , ya que te hace AutoAddPolicy ataques de intermediarios. Lo que terminé haciendo fue generar un known_hosts local known_hosts en la misma carpeta que el script:

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

y luego cargar este archivo en su lugar:

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

De esta manera, puedo distribuir los known_hosts junto con mi script y ejecutarlo en diferentes máquinas sin tocar los hosts_conocidos reales en esas máquinas.

## agregar usuario de forma remota ssh usando paramiko

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