sftp par batch ou apprendre à sftp et à ssh à communiquer
14 Avril 2008 23:38 | Par Miss Lemon dans Développement

J'ai été récemment confronté à un problème pour envoyer des fichiers en sftp.
La problématique d'origine était pourtant simple: Envoyer un fichier (format texte) vers un serveur sftp dont j'avais toutes les informations et même la clé rsa.
Je pose ma clé dans le dossier /home/user/.ssh qui va bien en lui mettant les droits 700 comme il se doit. Je sais que la clé jumelle existe sur le serveur de destination donc pas d'inquiétude sur ce point.
Mon fichier doit partir en pleine nuit, pas de souci, je cré une ligne dans la crontab de mon "user" qui lance un fichier php à l'heure choisie.
Ce fichier php, vérifie l'existence du dit fichier à envoyer et génère un autre fichier "commandes.sh"contenant les commandes qui seront lancées une fois connecté à mon serveur sftp, puis lance un bash shell "exec_commande.sh" qui se charge de la commande sftp en elle même .
J'ai lu préalablement qu'il fallait que j'utilise "ssh-agent" et "ssh-add".
ssh-agent est un programme qui sert à manipuler des clefs utilisées pour une authentification par clef publique (RSA, DSA).
ssh-add ajoute des identités RSA ou DSA à l'agent d'authentification
Je fais donc appel à ces eux avant le lancement du sftp. Seulement voilà , lorsque le cron lance le programme, rien n'aboutit.
Je décide de lancer les commandes une à une à la mano pour voir ou ça bloque: ça passe nickel, pas de soucis.
Le seul truc c'est qu'il me demande la "passphrase" lié à ma clé (passphrase qui soit dit en passant est vide). Mais comme je suis là pour taper sur entrée tout se passe bien.
Après de longues recherche, et quelques cheveux en moins (ou devenus blancs, ça dépend), j'ai trouvé la solution.
Je dois permettre à sftp de dialoguer avec l'agent pour obtenir la clé tout seul comme un grand, et donc ne plus demander la passphrase.
Lorsque ssh-agent est démarré, il retourne le code shell à exécuter. Utiliser "eval" permet le dialogue.
L'avantage de la solution est que tout fonctionne en automatique pendant que je dors, et que comme c'est un fichier php qui génère le fichier "commandes.sh", je peux envoyer de 0 à n fichiers selon les jours sans me soucier de rien. Voici donc les fichiers tels qu'ils sont au final .
Le fichier commandes.sh:
MAJ:ajout de la ligne "eval `ssh-agent -k`" qui permet de tuer le processus ssh-agent et d'éviter lors d'une automatisation par cron, une accumulation de processus ssh-agent ouverts.
ssh-add ajoute des identités RSA ou DSA à l'agent d'authentification
Je fais donc appel à ces eux avant le lancement du sftp. Seulement voilà , lorsque le cron lance le programme, rien n'aboutit.
Je décide de lancer les commandes une à une à la mano pour voir ou ça bloque: ça passe nickel, pas de soucis.
Le seul truc c'est qu'il me demande la "passphrase" lié à ma clé (passphrase qui soit dit en passant est vide). Mais comme je suis là pour taper sur entrée tout se passe bien.
Après de longues recherche, et quelques cheveux en moins (ou devenus blancs, ça dépend), j'ai trouvé la solution.
Je dois permettre à sftp de dialoguer avec l'agent pour obtenir la clé tout seul comme un grand, et donc ne plus demander la passphrase.
Lorsque ssh-agent est démarré, il retourne le code shell à exécuter. Utiliser "eval" permet le dialogue.
L'avantage de la solution est que tout fonctionne en automatique pendant que je dors, et que comme c'est un fichier php qui génère le fichier "commandes.sh", je peux envoyer de 0 à n fichiers selon les jours sans me soucier de rien. Voici donc les fichiers tels qu'ils sont au final .
Le fichier commandes.sh:
put /chemin/vers/fichier/fichier1 put /chemin/vers/fichier/fichier2 put /chemin/vers/fichier/fichier3 bye EOFLe fichier exec_commandes.sh:
#!/bin/bash eval `ssh-agent` ssh-add "/home/user/.ssh/cle_rsa" sftp -b /chemin/vers/fichier/commandes.sh -o IdentityFile="nom_fichier_cle" user@host_sftp eval `ssh-agent -k`
MAJ:ajout de la ligne "eval `ssh-agent -k`" qui permet de tuer le processus ssh-agent et d'éviter lors d'une automatisation par cron, une accumulation de processus ssh-agent ouverts.







Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire