217 votes

SFTP en Python? (indépendant de la plateforme)

Je suis en train de travailler sur un outil simple qui permet de transférer des fichiers à un emplacement codés en dur avec le mot de passe codés en dur. Je suis un python novice, mais grâce à ftplib, il était facile:

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)

Le problème est que je ne trouve pas de bibliothèque qui prend en charge le protocole sFTP. Quelle est la façon normale de faire quelque chose comme ceci en toute sécurité?

Edit: Merci pour les réponses ici, je l'ai eu à travailler avec Paramiko et ce fut la syntaxe.

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

Merci encore!

127voto

Brian Clapper Points 11222

Paramiko prend en charge le protocole SFTP. Je l'ai utilisé, et j'ai utilisé Tordu. Les deux ont leur place, mais vous trouverez peut-être plus facile de commencer avec Paramiko.

101voto

Dundee MT Points 63

Vous devriez vérifier pysftp https://pypi.python.org/pypi/pysftp il dépend paramiko, mais encapsule la plupart des cas d'utilisation courante à seulement quelques lignes de code.

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

17voto

hopla Points 1105

Si vous voulez facile et simple, vous pouvez également regarder le Tissu. C'est un outil de déploiement automatisé comme le Rubis de Capistrano, mais plus simple et ofc ourse pour Python. Il est construit sur le dessus de Paramiko.

Vous pourriez ne pas vouloir faire "déploiement automatisé", mais le Tissu adapté à votre cas d'utilisation parfaitement pas moins. Pour vous montrer à quel Tissu simple est: la fab de commande et de fichier pour votre script devrait ressembler à ceci (pas testé, mais 99% sûr que cela fonctionne):

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

Exécutez ensuite le fichier avec le fab commande:

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

Et vous avez terminé! :)

4voto

Daniel Naab Points 9857

Je collerais avec un pur Python solution, mais ce n'est pas vrai qu'il n'y a pas de Windows ssh options. Cygwin est une, par exemple, et il y a beaucoup plus.

3voto

umnik700 Points 6243

Tordu peut vous aider avec ce que vous faites, consultez leur documentation, les exemples ne manquent pas. Il est aussi un produit à maturité avec un grand développeur/utilisateur de la communauté derrière elle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X