Question

J'utilise un script bash (ci-dessous) sur un serveur distant (jusqu'à présent en utilisant ssh pour se connecter) pour exécuter un script python qui télécharge beaucoup de fichiers pdf un à la fois (obtenir les emplacements de téléchargement à partir d'un fichier texte avec l'URL) dans une boucle.

Je voudrais déplacer les fichiers du serveur distant à mon ordinateur local comme ils sont téléchargés, puis supprimez le fichier à partir du serveur distant. Est-il possible que je peux développer mon script bash pour le faire? Ou y at-il des solutions de rechange pour remplir cette tâche?

 while read line; do python python_script.py -l $line; done < pdfURLs.txt

Était-ce utile?

La solution

[Modifié pour refléter le fait que l'affiche originale ne peut pas scp dans son ordinateur local du serveur; Je suppose que ce qui se cache derrière NAT ou quelque chose du genre]

[Edit 2: Je garde la réponse à base de tunnel courant, pour référence; mais, puisque l'affiche originale est incapable de ssh de nouveau dans sa machine locale, je suppose que quelque chose d'autre bloque le tunnel. Voir la suggestion à la fin].

Ok, vous aurez besoin d'ouvrir un tunnel entre le serveur et votre ordinateur personnel. Ainsi, ssh à partir de votre ordinateur local (je suppose qu'il est basé sur Unix, vous avez mentionné est un Mac, de sorte que de bien) sur le serveur avec cette commande:

ssh -R 10022:localhost:22 your_server_address

En bref, ce transmettra le port du serveur 10022 (c'est un haut (> 1024) port, il est donc susceptible d'être disponible) au port de votre ordinateur local 22 (qui est l'endroit où ssh écoute habituellement). Autrement dit, une fois que vous avez fait cela, si vous ssh dans le port 10022, vous fait du exécution de ssh serveur dans votre ordinateur local. Si vous voulez tester, à partir du serveur, faites:

ssh -p 10022 localhost

Connectez-vous avec votre nom d'utilisateur de l'ordinateur local et mot de passe, et vous devriez voir son invite du shell. Si vous faites ce test, remeber pour vous déconnecter, afin de ne pas vous embrouiller.

Une fois que vous avez ouvert le tunnel, garder cette ouverture de connexion. Vous pouvez l'utiliser pour exécuter la ligne de commande bash qui télécharge le PDF etc, mais ce n'est pas nécessaire.

Ensuite, essayez la ligne de commande suivante:

while read line; do python python_script.py -l "$line"; scp -P 10022 *.pdf localhost:path/to/put/files/; rm *.pdf; done < pdfURLs.txt

Quelques choses à garder à l'esprit:

  • Ce attend jusqu'à ce que scp est terminée et alors seulement le script python téléchargé le suivant PDF. Vous avez mentionné que vous vouliez effectivement cela, de ne pas conserver les fichiers PDF sur le serveur pour longtemps.
  • Cette copie tous les fichiers PDF à partir du répertoire courant sur votre ordinateur local (puis les efface), donc de préférence exécuter ce depuis un répertoire précédemment vide.
  • Je suppose que vous pouvez scp sans avoir à saisir un mot de passe (en utilisant l'authentification par clé partagée, par exemple), sinon il pourrait être un peu ennuyeux, avoir à retaper votre mot de passe tout le temps.

Cela devrait le faire.

[Edité pour ajouter cette alternative, lorsque le tunnel ne fonctionne pas]

Si cela échoue, je ne peux que supposer quelque chose d'autre bloque votre ssh / scp du serveur sur votre machine locale. Dans ce cas, vous pouvez essayer quelque chose de différent: de vous locale la machine, faire

while read line; do ssh -n server_address "cd tmp_download_directory && rm -f *.pdf && python python_script.py -l $line" && scp server_address:tmp_download_directory/*.pdf /local/path/to/put/files/; done < pdfURLs.txt; ssh server_address "rm -f tmp_download_directory/*.pdf"

(Le commutateur "-n" à ssh est nécessaire, et non à l'alimentation subsequente lignes $ dans le shell ssh.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top