Estoy trabajando en una herramienta simple que transfiere archivos a una ubicación codificada con la contraseña también codificada. Soy un principiante en 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 así de forma segura?
Editar: Gracias a las respuestas aquí, lo conseguí 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!
Respuestas:
Paramiko admite SFTP. Lo he usado y he usado Twisted. Ambos tienen su lugar, pero puede ser más fácil comenzar con Paramiko.
fuente
Debe consultar pysftp https://pypi.python.org/pypi/pysftp , depende de paramiko, pero ajusta los casos de uso más comunes a solo unas pocas líneas de código.
fuente
with
en el ejemplopip install pysftp
Si quieres fácil y simple, también puedes mirar Fabric . Es una herramienta de implementación automatizada como Ruby's Capistrano, pero más simple y, por supuesto, para Python. Está construido sobre Paramiko.
Es posible que no desee realizar una 'implementación automatizada', pero Fabric se adaptaría perfectamente a su caso de uso. Para mostrarle lo simple que es Fabric: el archivo fab y el comando para su script se verían así (no probado, pero 99% seguro de que funcionará):
fab_putfile.py:
Luego ejecute el archivo con el comando fab:
¡Y tu estas listo! :)
fuente
Aquí hay una muestra usando pysftp y una clave privada.
pysftp es un módulo sftp fácil de usar que utiliza paramiko y pycrypto. Proporciona una interfaz simple para sftp. Otras cosas que puede hacer con pysftp que son bastante útiles:
Más comandos y sobre PySFTP aquí .
fuente
srv.get(file_path) # Download a file from remote server
¿Puedes explicar dónde descarga el archivo?Twisted puede ayudarlo con lo que está haciendo, consulte su documentación, hay muchos ejemplos. También es un producto maduro con una gran comunidad de desarrolladores / usuarios detrás.
fuente
Con la clave RSA, consulte aquí
Retazo:
fuente
Hay un montón de respuestas que mencionan pysftp, por lo que en el 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 lo siguiente cuando se usa
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 reintento automático en caso de que no pueda conectarse la primera vez (lo que sorprendentemente ocurre 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/80a19c22012e42d4d6e791c1e4eb8515fuente
Paramiko es muy lento. Utilice subproceso y shell, aquí hay un ejemplo:
fuente
PyFilesystem con sus sshfs es una opción. Utiliza Paramiko debajo del capó y proporciona una interfaz independiente de plataforma más agradable en la parte superior.
o
fuente
Puedes usar el módulo pexpect
Aquí hay una buena publicación de introducción
No he probado esto pero debería funcionar
fuente