python - pysftp example
Verifique la clave de host con pysftp (6)
Estoy escribiendo un programa usando pysftp, y quiere verificar la clave de host SSH contra
C:/Users/JohnCalvin/.ssh/known_hosts
.
Usando PuTTY, el programa de terminal lo guarda en el Registro
[HKEY_CURRENT_USER/Software/SimonTatham/PuTTY/SshHostKeys]
.
¿Cómo concilio la diferencia entre pysftp y PuTTY?
Mi código es:
import pysftp as sftp
def push_file_to_server():
s = sftp.Connection(host=''138.99.99.129'', username=''root'', password=''*********'')
local_path = "testme.txt"
remote_path = "/home/testme.txt"
s.put(local_path, remote_path)
s.close()
push_file_to_server()
La respuesta de error que estoy recibiendo es:
E: / Archivos de programa (x86) / Anaconda3 / lib / site-packages / pysftp__init __. Py: 61: Advertencia del usuario:
Error al cargar HostKeys desde C: / Users / JohnCalvin.ssh / known_hosts.
Deberá cargar HostKeys explícitamente (cnopts.hostkeys.load (nombre de archivo)) o deshabilitar la comprobación de HostKey (cnopts.hostkeys = Ninguno). warnings.warn (wmsg, UserWarning) Traceback (última llamada más reciente): Archivo "E: / OneDrive / Python / GIT / DigitalCloud / pysftp_tutorial.py", línea 14, en push_file_to_server () Archivo "E: / OneDrive / Python / GIT / DigitalCloud / pysftp_tutorial.py ", línea 7, en push_file_to_server s = sftp.Connection (host = ''138.99.99.129'', username = ''root'', password = ''********'') Archivo" E : / Archivos de programa (x86) / Anaconda3 / lib / site-packages / pysftp__init __. Py ", línea 132, en init self._tconnect [''hostkey''] = self._cnopts.get_hostkey (host) Archivo" E: / Archivos de programa (x86) / Anaconda3 / lib / site-packages / pysftp__init __. py ", línea 71, en get_hostkey raise SSHException (" No se encontró la clave de host para el host% s. "% host) paramiko.ssh_exception.SSHException: No hay hostkey para el host 138.99. 99,129 encontrado. Excepción ignorada en:> Traceback (última llamada reciente): Archivo "E: / Archivos de programa (x86) / Anaconda3 / lib / site-packages / pysftp__init __. Py", línea 1013, en del archivo self.close () del archivo "E : / Archivos de programa (x86) / Anaconda3 / lib / site-packages / pysftp__init __. Py ", línea 784, en cierre si self._sftp_live: AttributeError: el objeto ''Conexión'' no tiene atributo ''_sftp_live''
Conéctese primero al servidor con un cliente ssh de Windows que use el archivo known_hosts. PuTTy almacena los datos en el registro de Windows, sin embargo, OpenSSH usa el archivo known_hosts y agregará entradas allí después de que se conecte. La ubicación predeterminada para el archivo es% USERPROFILE% .ssh. espero que esto ayude
Hola, tuvimos el mismo problema si te entiendo bien. Así que verifica qué versión de pysftp estás usando. Si es el último que tiene un retroceso de 0.2.9 a 0.2.8. Mira esto. https://github.com/Yenthe666/auto_backup/issues/47
Implementé
auto_add_key
en mi
pysftp github fork
.
auto_add_key
agregará la clave a
known_hosts
si
auto_add_key=True
Una vez que una clave está presente para un host en
known_hosts
esta clave será verificada.
Consulte -> respuesta sobre inquietudes de seguridad.
Aunque para una seguridad absoluta, no debe recuperar la clave de host de forma remota, ya que no puede estar seguro, si aún no está siendo atacado.
import pysftp as sftp def push_file_to_server(): s = sftp.Connection(host=''138.99.99.129'', username=''root'', password=''pass'', auto_add_key=True) local_path = "testme.txt" remote_path = "/home/testme.txt" s.put(local_path, remote_path) s.close() push_file_to_server()
Nota: ¿Por qué usar el administrador de contexto?
import pysftp with pysftp.Connection(host, username="whatever", password="whatever", auto_add_key=True) as sftp: #do your stuff here #connection closed
Intente utilizar la versión 0.2.8 de la biblioteca pysftp.
$ pip uninstall pysftp && pip install pysftp==0.2.8
Y prueba con esto:
try:
ftp = pysftp.Connection(host, username=user, password=password)
except:
print("Couldn''t connect to ftp")
return False
¿Por qué esto? Básicamente es un error con el 0.2.9 de pysftp aquí todos los detalles https://github.com/Yenthe666/auto_backup/issues/47
La siguiente solución funcionó para mí:
import pysftp
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp:
sftp.put(local_path, remote_path)
Puede encontrar más información aquí: https://.com/a/38355117/1060738
* Editar *
Al configurar
cnopts.hostkeys=None
, perderás la protección contra los ataques de Man-in-the-middle al hacerlo.
Use la respuesta @ martin-prikryl para evitar eso.
No configure
cnopts.hostkeys = None
(como lo muestra la respuesta más votada), a menos que no le importe la seguridad.
Pierdes una protección contra
los ataques de Man-in-the-middle
al hacerlo.
Use
CnOpts.hostkeys
(devuelve
HostKeys
) para administrar claves de host de confianza.
cnopts = pysftp.CnOpts()
cnopts.hostkeys.load(''known_hosts'')
with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp:
donde
known_hosts
contiene una clave pública del servidor [s] en un formato como:
example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
Si no desea usar un archivo externo, también puede usar
from base64 import decodebytes
# ...
keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB..."""
key = paramiko.RSAKey(data=decodebytes(keydata))
cnopts = pysftp.CnOpts()
cnopts.hostkeys.add(''example.com'', ''ssh-rsa'', key)
with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp:
Una manera fácil de recuperar la clave de host en este formato es utilizando OpenSSH
ssh-keyscan
:
$ ssh-keyscan example.com
# example.com SSH-2.0-OpenSSH_5.3
example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
También puede hacer que la aplicación haga lo mismo automáticamente:
Utilice Paramiko AutoAddPolicy con pysftp
(Agregará automáticamente claves de host de nuevos hosts a
known_hosts
, pero para claves de host conocidas, no aceptará una clave modificada)
Aunque para una seguridad absoluta, no debe recuperar la clave de host de forma remota, ya que no puede estar seguro, si aún no está siendo atacado.
Vea mi artículo
¿Dónde obtengo la huella digital de la clave de host SSH para autorizar el servidor?
Es para mi cliente WinSCP SFTP, pero la mayoría de la información allí es válida en general.
Si necesita verificar la clave de host utilizando solo su huella digital, consulte Python - pysftp / paramiko - Verificar clave de host utilizando su huella digital .