J'ai un fichier texte sur ma machine locale qui est généré par un script Python quotidien exécuté dans cron.
Je voudrais ajouter un peu de code pour que ce fichier soit envoyé en toute sécurité à mon serveur via SSH.
python
ssh
automation
scp
Alok
la source
la source
Réponses:
Vous pouvez appeler la
scp
commande bash (elle copie les fichiers via SSH ) avecsubprocess.run
:Si vous créez le fichier que vous souhaitez envoyer dans le même programme Python, vous voudrez appeler la
subprocess.run
commande en dehors duwith
bloc que vous utilisez pour ouvrir le fichier (ou appeler.close()
d'abord le fichier si vous n'utilisez pas dewith
block), vous savez donc qu'il est vidé sur le disque à partir de Python.Vous devez générer (sur la machine source) et installer (sur la machine de destination) une clé ssh au préalable afin que le scp soit automatiquement authentifié avec votre clé publique ssh (en d'autres termes, votre script ne demande pas de mot de passe) .
la source
subprocess.check_call(['scp', srcfile, dest])
pourrait être utilisé depuis Python 2.5 au lieu derc = Popen(..).wait(); if rc != 0: raise ..
Pour faire cela en Python (c'est-à-dire ne pas encapsuler scp via subprocess.Popen ou similaire) avec la bibliothèque Paramiko , vous feriez quelque chose comme ceci:
(Vous voudrez probablement traiter des hôtes inconnus, des erreurs, la création de tous les répertoires nécessaires, etc.).
la source
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
après l'instanciationssh
.Vous utiliseriez probablement le module de sous - processus . Quelque chose comme ça:
Où
destination
est probablement de la formeuser@remotehost:remotepath
. Merci à @Charles Duffy d'avoir souligné la faiblesse de ma réponse originale, qui utilisait un seul argument de chaîne pour spécifier l'opération scpshell=True
- qui ne gérerait pas les espaces dans les chemins.La documentation du module a exemples de vérification des erreurs que vous souhaiterez peut-être effectuer conjointement avec cette opération.
Assurez-vous que vous avez configuré les informations d'identification appropriées afin de pouvoir effectuer un scp sans surveillance et sans mot de passe entre les machines . Il y a déjà une question de stackoverflow pour cela .
la source
subprocess.check_call(['scp', myfile, destination])
pourrait être utilisé à la place depuis Python 2.5 (2006)Il existe plusieurs façons d'aborder le problème:
Chaque approche a ses propres bizarreries. Vous devrez configurer des clés SSH pour activer les connexions sans mot de passe si vous encapsulez des commandes système telles que «ssh», «scp» ou «rsync». Vous pouvez intégrer un mot de passe dans un script en utilisant Paramiko ou une autre bibliothèque, mais vous pourriez trouver le manque de documentation frustrant, surtout si vous n'êtes pas familier avec les bases de la connexion SSH (par exemple - échanges de clés, agents, etc.). Il va probablement 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 un ancien scp.
J'ai utilisé Paramiko dans le but de remplacer les appels système, mais je me suis retrouvé attiré par les commandes encapsulées en raison de leur facilité d'utilisation et de leur familiarité immédiate. Vous pourriez être différent. J'ai donné une fois à Conch il y a quelque temps, mais cela ne m'a pas plu.
Si vous optez pour le chemin de l'appel système, Python propose un tableau d'options telles que os.system ou les commandes / modules de sous-processus. J'irais avec le module de sous-processus si vous utilisez la version 2.4+.
la source
Atteint le même problème, mais au lieu de "pirater" ou d'émuler la ligne de commande:
J'ai trouvé cette réponse ici .
la source
Vous pouvez faire quelque chose comme ça, pour gérer également la vérification de la clé hôte
la source
fabric
pourrait être utilisé pour télécharger des fichiers vis ssh:la source
Vous pouvez utiliser le package vassal, qui est exactement conçu pour cela.
Tout ce dont vous avez besoin est d'installer vassal et de faire
En outre, cela vous évitera de vous authentifier et vous n'aurez pas besoin de les saisir encore et encore.
la source
J'ai utilisé sshfs pour monter le répertoire distant via ssh et shutil pour copier les fichiers:
Puis en python:
Cette méthode présente l'avantage que vous pouvez diffuser des données si vous générez des données plutôt que de les mettre en cache localement et d'envoyer un seul fichier volumineux.
la source
Essayez ceci si vous ne souhaitez pas utiliser de certificats SSL:
la source
Utilisation de la ressource externe paramiko;
la source
L'appel de
scp
commande via un sous-processus ne permet pas de recevoir le rapport de progression à l'intérieur du script.pexpect
pourrait être utilisé pour extraire cette information:Voir le fichier de copie python dans le réseau local (linux -> linux)
la source
Une approche très simple est la suivante:
Aucune bibliothèque python n'est requise (seulement os), et cela fonctionne, cependant l'utilisation de cette méthode dépend d'un autre client ssh à installer. Cela peut entraîner un comportement indésirable s'il est exécuté sur un autre système.
la source
Un peu hacky, mais ce qui suit devrait fonctionner :)
la source