J'avais l'habitude d'obtenir un fichier image fixe d'un serveur fixe chaque mois et de créer régulièrement du matériel de réunion, C'était difficile de plonger dans WinSCP et de l'obtenir, j'ai donc décidé de l'automatiser avec Python.
Quand je l'ai vérifié, il semblait que je pouvais le faire en utilisant paramiko et scp, alors je l'ai essayé.
Côté exécution: Windows Server 2012 Obtenu à partir de: CentOS Linux 7
Pour les terminaux connectés à Internet, un pip normal convient
py -m pip install paramiko
Si vous êtes dans un environnement hors ligne, téléchargez-le une fois, puis installez-le.
py -m pip download -d C:\tmp --no-binary :all: paramiko
Quand j'ai tapé la commande ci-dessus
ERROR: Command errored out with exit status 1:
J'ai eu l'erreur et je n'ai pas pu télécharger.
Après avoir combattu pendant un moment
py -m pip download -d C:\tmp paramiko
J'ai pu le télécharger sur.
L'option --no-binary
télécharge la source, pas le binaire
C'est quelque chose qui le rend moins sensible à l'environnement, mais cela ne semble pas bien fonctionner avec lui.
Emportez le fichier téléchargé vers la destination d'installation et installez-le avec la commande suivante.
pip install --no-index --find-links=tmp paramiko
Je ne savais pas pourquoi je ne pouvais pas le faire de la manière habituelle, mais dans mon environnement, cela fonctionne bien avec ce qui précède.
Tout d'abord, essayons de créer ʻimport paramiko`. Si vous ne pouvez pas, il y a un problème avec la méthode d'installation.
Tout d'abord, je vais mettre le code nécessaire.
import paramiko
import scp
#Informations de connexion au serveur
host = "adresse IP"
user = "Nom d'utilisateur"
pas = "mot de passe"
#Répertoire de sortie
out_path = r"C:\temp"
#Chemin du fichier cible
target_path = "/var/tmp/hoge.log"
#Connexion serveur
with paramiko.SSHClient() as sshc:
sshc.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sshc.connect(hostname=host, port=22, username=user, password=pas)
#Traitement de copie par SCP
with scp.SCPClient(sshc.get_transport()) as scpc:
scpc.get(remote_path=target_path, local_path=out_path)
Je n'ai pas encore essayé diverses choses, donc je ne comprends pas les détails, mais d'une manière ou d'une autre.
scpc.get(remote_path=target_path, local_path=out_path)
Concernant les deux arguments ici, il semble que seul le type chaîne de caractères soit accepté.
Convertissez un objet * Path * pratique en une chaîne avec str ()
etc. avant de le passer.
Au fait, même si vous ne déclarez pas l'élément
scpc.get(target_path, out_path)
Cela fonctionne bien avec. Cependant, puisque cette fonction a d'autres arguments, elle est spécifiée comme une magie.
J'ai trouvé que c'était simple et très facile à utiliser.
Dans le cas de Linux, le délimiteur de hiérarchie est /
au lieu de \
, il est donc facile de le combiner avec une simple chaîne de caractères.
(Bien sûr, les fenêtres \
peuvent également être traitées comme une chaîne de caractères)
Dans mon cas, j'ai créé la liste de fichiers cible en boucle comme indiqué ci-dessous.
for day in day_list:
target_list.append(f"{port}/result{port}-{day}.png ")
Vous pouvez également exécuter des commandes avec paramiko
, mais cela est résumé séparément.
Recommended Posts