Descargar directorio recursivo con Paramiko?

Quiero descargar un directorio con contenido desconocido recursivamente a través de SSH y he estado probando Paramiko. He visto varios ejemplos de cómo subir directorios pero ninguno que cubra descargas recursivas.

Puedo enumerar todos los elementos en un directorio pero no he podido encontrar una manera de saber si el elemento es un archivo (para descargar) o un directorio (para llamar de forma recursiva).

transport = paramiko.Transport((MY_IP, 22)) transport.connect(username=MY_NAME, password=MY_PASS) sftp = paramiko.SFTPClient.from_transport(transport) file_list = sftp.listdir(path='/home/MY_HOME_DIR') for item in file_list: # Here is an item name... but is it a file or directory? print(item) sftp.close() transport.close() 

Entonces, ¿cómo puedo saber si un elemento es un archivo o si es un directorio?

 from stat import S_ISDIR def isdir(path): try: return S_ISDIR(sftp.stat(path).st_mode) except IOError: #Path does not exist, so by definition not a directory return False 

… asumiendo que sftp es una conexión SFTP de Paramiko abierta.

Puedes usar el método stat () de tu objeto sftp:

http://www.lag.net/paramiko/docs/paramiko.SFTPClient-class.html

El método stat () entre otros atributos devuelve permisos. d (por ejemplo, drwxrwxrwx) muestra que es un directorio.

Como ejemplo:

 dir = oct(sftp.stat(path).st_mode) print dir[0:2] 

interpretación de salida: 01 fifo 02 carácter especial 04 directorio 06 bloque especial 10 archivo regular 12 enlace simbólico 14 socket

Una pregunta antigua, pero se me ocurrió una solución que funciona bastante bien, es un poco descuidada (mecanografía y barras y todo), pero funciona.

Tenga en cuenta que esto utiliza fabric.api.local para hacer los directorios en el destino.

 def sftp_get_recursive(path, dest, sftp=sftp): item_list = sftp.listdir(path) dest = str(dest) if not os.path.isdir(dest): local("mkdir %s" % dest) for item in item_list: item = str(item) if is_directory(path + "/" + item, sftp): sftp_get_recursive(path + "/" + item, dest + "/" + item, sftp) else: sftp.get(path + "/" + item, dest + "/" + item) 

Paramiko no soporta operaciones recursivas.

Puedes usar pysftp . Es una envoltura alrededor de Paramiko que tiene más apariencia de Python-ish y admite operaciones recursivas. Ver

  • pysftp.Connection.put_r()
  • pysftp.Connection.get_r()

O simplemente puede basar su código en el código fuente de pysftp . O vea que mi respuesta a Python pysftp get_r de Linux funciona bien en Linux pero no en Windows .

Si usas Linux o como Unix. Puedes usar la utilidad ‘file’ con popen. O simple u puede usar os.path.isdir () =)