python sftp

SFTP en Python?(plataforma independiente)



pysftp (9)

Aquí hay una muestra usando pysftp y una clave privada.

import pysftp def upload_file(file_path): private_key = "~/.ssh/your-key.pem" # can use password keyword in Connection instead srv = pysftp.Connection(host="your-host", username="user-name", private_key=private_key) srv.chdir(''/var/web/public_files/media/uploads'') # change directory on remote server srv.put(file_path) # To download a file, replace put with get srv.close() # Close connection

pysftp es un módulo sftp fácil de usar que utiliza paramiko y pycrypto. Proporciona una interfaz simple para sftp. Otras cosas que puedes hacer con pysftp que son bastante útiles:

data = srv.listdir() # Get the directory and file listing in a list srv.get(file_path) # Download a file from remote server srv.execute(''pwd'') # Execute a command on the server

Más comandos y sobre PySFTP here .

Estoy trabajando en una herramienta simple que transfiere archivos a una ubicación codificada con la contraseña también codificada. Soy un principiante de Python, pero gracias a ftplib, fue fácil:

import ftplib info= (''someuser'', ''password'') #hard-coded def putfile(file, site, dir, user=(), verbose=True): """ upload a file by ftp to a site/directory login hard-coded, binary transfer """ if verbose: print ''Uploading'', file local = open(file, ''rb'') remote = ftplib.FTP(site) remote.login(*user) remote.cwd(dir) remote.storbinary(''STOR '' + file, local, 1024) remote.quit() local.close() if verbose: print ''Upload done.'' if __name__ == ''__main__'': site = ''somewhere.com'' #hard-coded dir = ''./uploads/'' #hard-coded import sys, getpass putfile(sys.argv[1], site, dir, user=info)

El problema es que no puedo encontrar ninguna biblioteca que admita sFTP. ¿Cuál es la forma normal de hacer algo como esto de forma segura?

Editar: Gracias a las respuestas aquí, lo he conseguido trabajando con Paramiko y esta fue la sintaxis.

import paramiko host = "THEHOST.com" #hard-coded port = 22 transport = paramiko.Transport((host, port)) password = "THEPASSWORD" #hard-coded username = "THEUSERNAME" #hard-coded transport.connect(username = username, password = password) sftp = paramiko.SFTPClient.from_transport(transport) import sys path = ''./THETARGETDIRECTORY/'' + sys.argv[1] #hard-coded localpath = sys.argv[1] sftp.put(localpath, path) sftp.close() transport.close() print ''Upload done.''

¡Gracias de nuevo!


Con la clave RSA, consulte here

Retazo:

import pysftp import paramiko from base64 import decodebytes keydata = b"""L+WsiL5VL51ecJi3LVjmblkAdUTU+xbmXmUArIU5+8N6ua76jO/+T""" key = paramiko.RSAKey(data=decodebytes(keydata)) cnopts = pysftp.CnOpts() cnopts.hostkeys.add(host, ''ssh-rsa'', key) with pysftp.Connection(host=host, username=username, password=password, cnopts=cnopts) as sftp: with sftp.cd(directory): sftp.put(file_to_sent_to_ftp)


Debería echarle un vistazo a pysftp https://pypi.python.org/pypi/pysftp , depende de paramiko, pero envuelve la mayoría de los casos de uso a solo unas pocas líneas de código.

import pysftp import sys path = ''./THETARGETDIRECTORY/'' + sys.argv[1] #hard-coded localpath = sys.argv[1] host = "THEHOST.com" #hard-coded password = "THEPASSWORD" #hard-coded username = "THEUSERNAME" #hard-coded with pysftp.Connection(host, username=username, password=password) as sftp: sftp.put(localpath, path) print ''Upload done.''


Hay un montón de respuestas que mencionan pysftp, por lo que, en caso de que desee un contenedor de administrador de contexto alrededor de pysftp, aquí hay una solución que es aún menos código que termina pareciéndose a la siguiente cuando se usa

path = "sftp://user:p@[email protected]/path/to/file.txt" # Read a file with open_sftp(path) as f: s = f.read() print s # Write to a file with open_sftp(path, mode=''w'') as f: f.write("Some content.")

El ejemplo (más completo): http://www.prschmid.com/2016/09/simple-opensftp-context-manager-for.html

Este administrador de contexto tiene una lógica de reintentos automática integrada en caso de que no pueda conectarse la primera vez (lo que sorprendentemente sucede con más frecuencia de lo que esperaría en un entorno de producción ...)

La esencia del administrador de contexto para open_sftp : https://gist.github.com/prschmid/80a19c22012e42d4d6e791c1e4eb8515


Paramiko es muy lento Use subproceso y shell, aquí hay un ejemplo:

remote_file_name = "filename" remotedir = "/remote/dir" localpath = "/local/file/dir" ftp_cmd_p = """ #!/bin/sh lftp -u username,password sftp://ip:port <<EOF cd {remotedir} lcd {localpath} get {filename} EOF """ subprocess.call(ftp_cmd_p.format(remotedir=remotedir, localpath=localpath, filename=remote_file_name ), shell=True, stdout=sys.stdout, stderr=sys.stderr)



Si quieres fácil y simple, es posible que también quieras mirar a Fabric . Es una herramienta de implementación automatizada como Ruby''s Capistrano, pero más simple y gratuita para Python. Está construido encima de Paramiko.

Es posible que no desee hacer una "implementación automatizada", pero Fabric se adaptaría perfectamente a su caso de uso. Para mostrarle cuán simple es Fabric: el archivo fab y el comando para su script se vería así (no probado, pero 99% seguro de que funcionará):

fab_putfile.py:

from fabric.api import * env.hosts = [''THEHOST.com''] env.user = ''THEUSER'' env.password = ''THEPASSWORD'' def put_file(file): put(file, ''./THETARGETDIRECTORY/'') # it''s copied into the target directory

A continuación, ejecute el archivo con el comando fab:

fab -f fab_putfile.py put_file:file=./path/to/my/file

¡Y tu estas listo! :)


Twisted puede ayudarlo con lo que está haciendo, revise su documentación, hay muchos ejemplos. También es un producto maduro con una gran comunidad de desarrolladores / usuarios detrás.


Paramiko compatible con SFTP. Lo he usado, y he usado Twisted. Ambos tienen su lugar, pero puede que le resulte más fácil comenzar con Paramiko.