Comment copier un fichier sur un serveur distant en Python à l'aide de SCP ou SSH?
J'ai un fichier texte sur ma machine locale qui est généré par une pratique quotidienne de Python script de s'exécuter dans cron.
Je voudrais ajouter un peu de code pour avoir cette fiche sera envoyé en toute sécurité à mon serveur via SSH.
- trouvé quelque chose de similaire , peut-u avoir un look stackoverflow.com/questions/11009308/...
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez que l'approche la plus simple, cela devrait fonctionner.
Que vous voudrez ".close()" d'abord le fichier de sorte que vous savez qu'il est vidé sur le disque à partir de Python.
Vous devez générer (sur la machine source) et de l'installer (sur la machine de destination) une clé ssh à l'avance afin que le scp est automatiquement authentifié avec votre clé ssh publique (en d'autres mots, si votre script n'est pas demander un mot de passe).
ssh-keygen exemple
rc = Popen(..).wait(); if rc != 0: raise ..
Pour ce faire en Python (c'est à dire pas d'emballage scp par le biais de sous-processus.Popen ou similaire) avec le Paramiko bibliothèque, vous voulez faire quelque chose comme ceci:
(Vous auriez probablement eu envie de traiter avec les hôtes inconnus, d'erreurs, de créer les répertoires nécessaires, et ainsi de suite).
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
après l'instanciation dessh
.Vous serais probablement utiliser la sous-processus module. Quelque chose comme ceci:
Où
destination
est probablement de la formeuser@remotehost:remotepath
. Grâce à@Charles Duffy pour souligner la faiblesse dans ma réponse originale à cette question, qui a utilisé un seul argument de type chaîne pour spécifier la scp opération
shell=True
- qui ne serait pas gérer les espaces dans les chemins.La documentation du module a exemples de vérification d'erreur que vous voudrez peut-être effectuer en parallèle avec cette opération.
Assurer que vous avez configuré les informations d'identification appropriées, de sorte que vous pouvez effectuer une sans assistance, sans mot de passe scp entre les machines. Il y a un stackoverflow question déjà.
subprocess.check_call(['scp', myfile, destination])
pourrait être utilisé depuis Python 2.5 (2006)Il ya un couple de façons différentes d'aborder le problème:
Chaque approche a ses propres particularités. Vous aurez besoin de configurer des clés SSH pour activer le mot de passe de moins de connexions d'accès si vous êtes d'emballage système de commandes comme "ssh", "scp" ou "rsync." Vous pouvez incorporer un mot de passe dans un script à l'aide de Paramiko ou d'une autre bibliothèque, mais vous pourriez trouver de l'absence de documentation frustrant, surtout si vous n'êtes pas familier avec les bases de la connexion SSH (par exemple, - les échanges de clé, agents, etc). Il va sans dire que les clés SSH sont presque toujours une meilleure idée que les mots de passe pour ce genre de choses.
REMARQUE: il est difficile de battre rsync si vous prévoyez de transférer des fichiers via SSH, surtout si l'alternative est simple vieux scp.
J'ai utilisé Paramiko avec un oeil vers le remplacement du système d'appels, mais me suis retrouvé ramené à l'enveloppé commandes en raison de leur facilité d'utilisation et immédiate de la familiarité. Vous peut-être différente. J'ai donné une Conque, une fois il y a quelque temps, mais il n'a pas fait appel à moi.
Si optant pour l'appel-système de chemin, Python offre un éventail d'options telles que les os.ou le système de commandes/sous-processus des modules. J'irais avec le sous-processus module si vous utilisez la version 2.4+.
Atteint le même problème, mais au lieu de "piratage" ou l'émulation de la ligne de commande:
Trouvé cette réponse ici.
Vous pouvez faire quelque chose comme cela, à la poignée de la clé d'hôte de vérification en tant que bien
tissu
pourrait être utilisé pour télécharger des fichiers vis ssh:Vous pouvez utiliser le vassal paquet, ce qui est exactement conçu pour cela.
Tous vous avez besoin est d'installer vassal et ne
Aussi, il permettra d'économiser que vous authentifier les informations d'identification et n'ont pas besoin de taper encore et encore.
Essayer si vous wan pas d'utiliser des certificats SSL:
Appel
scp
commande via le sous-processus ne permet pas de recevoir le rapport d'avancement à l'intérieur du script.pexpect
pourrait être utilisé pour extraire cette info:Voir python copie de fichiers en réseau local (linux -> linux)
J'ai utilisé sshfs pour monter le répertoire distant via ssh, et shutil copier les fichiers:
Puis en python:
Cette méthode a l'avantage que vous pouvez flux de données sur si vous générez des données plutôt que la mise en cache localement et à l'envoi d'un seul gros fichier.
une approche très simple est la suivante:
pas de bibliothèque python sont nécessaires (seul l'os) et il fonctionne
À l'aide de la ressource externe paramiko;
Genre de hacky, mais la suivante devrait fonctionner 🙂