73 votes

Le client SSHC de Paramiko avec SFTP

Comment puis-je faire transporter SFTP par SSHClient sur le serveur distant ? J'ai un hôte local et deux hôtes distants. Les hôtes distants sont le serveur de sauvegarde et le serveur web. Je dois trouver sur le serveur de sauvegarde le fichier de sauvegarde nécessaire et le mettre sur le serveur web via SFTP. Comment puis-je faire en sorte que le transport SFTP de Paramiko fonctionne avec l'interface de Paramiko ? SSHClient ?

188voto

leoluk Points 6039

paramiko.SFTPClient

Utilisation de l'échantillon :

import paramiko
paramiko.util.log_to_file("paramiko.log")

# Open a transport
host,port = "example.com",22
transport = paramiko.Transport((host,port))

# Auth    
username,password = "bar","foo"
transport.connect(None,username,password)

# Go!    
sftp = paramiko.SFTPClient.from_transport(transport)

# Download
filepath = "/etc/passwd"
localpath = "/home/remotepasswd"
sftp.get(filepath,localpath)

# Upload
filepath = "/home/foo.jpg"
localpath = "/home/pony.jpg"
sftp.put(localpath,filepath)

# Close
if sftp: sftp.close()
if transport: transport.close()

2 votes

Excellente réponse. J'ajouterais cependant que les deux Transport y SFTPClient mettre en œuvre la __enter__ / __exit__ peut donc être utilisée dans le cadre d'un gestionnaire de contexte, par exemple. with Transport((host, port)) as transport:

0 votes

Cette implémentation fonctionne mais elle ne nettoie pas les processus. Le processus sftp-server est bifurqué avec elle et si vous l'exécutez plusieurs fois, vous pouvez voir qu'il y a beaucoup de processus qui existent après l'achèvement du code.

2 votes

Bien que cette travaux avec son utilisation de l'option de bas niveau Transport il contourne la vérification de la clé de l'hôte, ce qui constitue une faille de sécurité, car cela rend le code susceptible de Attaques de type "Man-in-the-middle . Le mieux est d'utiliser la bonne API Paramiko SSH, la SSHClient . Voir ma réponse .

14voto

Martin Prikryl Points 4584

La réponse acceptée "travaux" . Mais avec son utilisation du bas niveau Transport il contourne la vérification de la clé de l'hôte, ce qui constitue une faille de sécurité, car cela rend le code susceptible de Attaques de type "Man-in-the-middle .

Le mieux est d'utiliser la bonne API SSH de Paramiko, la SSHClient qui vérifie la clé de l'hôte :

import paramiko
paramiko.util.log_to_file("paramiko.log")

ssh = paramiko.SSHClient()
ssh.connect(host, username='user', password='password')
# or 
# key = paramiko.RSAKey.from_private_key_file('id_rsa')
# ssh.connect(host, username='user', pkey=key)

sftp = ssh.open_sftp()

sftp.get(remotepath, localpath)
# or
sftp.put(localpath, remotepath)

Pour plus de détails sur la vérification de la clé hôte, voir :
Paramiko "Serveur inconnu"

8voto

Alon Gouldman Points 363

Si vous avez un client SSHC, vous pouvez également utiliser open_sftp() :

import paramiko

# lets say you have SSH client...
client = paramiko.SSHClient()

sftp = client.open_sftp()

# then you can use upload & download as shown above
...

2 votes

Tout d'abord, il ne s'agit pas d'une réponse autonome, mais d'un simple commentaire à la réponse de @leoluk. Deuxièmement, si vous avez SSHClient vous pouvez simplement faire sftp = client.open_sftp() .

1voto

David W. Points 95

En plus de la première réponse qui est excellente mais qui dépend du nom d'utilisateur/mot de passe, ce qui suit montre comment utiliser une clé ssh :

from paramiko import Transport, SFTPClient, RSAKey
key = RSAKey(filename='path_to_my_rsakey')
con = Transport('remote_host_name_or_ip', 22)
con.connect(None,username='my_username', pkey=key)
sftp = SFTPClient.from_transport(con)
sftp.listdir(path='.')

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