J'ai eu envie de me simplifier la vie aujourd'hui. J'ai décidé d'écrire une tâche Rake pour uploader des fichiers souvent mis à jours, sur un serveur distant.
Je n'avais aucunes idée de la meilleure solution et comme souvent dans ces cas là, ca n'a pas été simple de la découvrir.
Je me suis d'abord intéressé à Capistrano mais je l'ai trouvé surdimensionné par rapports à mes besoins personnels. Je croyais que rsync serais à ma mesure mais le manque de documentation m'a freiné.
Et puis j'ai réalisé qu'un simple sftp me convenait parfaitement. Cela avait plusieurs avantages : possible connection automatique (il semble que ce soit la différence avec scp) et possible utilisation de la librairie Net::SFTP.
Mais mauvaises surprises: je n'aime pas la syntaxe de Net::SFTP (NB: et il existe déja un script pour la synchronisation à distance) et la connection automatique de sftp par batchfile n'accepte pas les passwords!
Il a donc fallu générer des clés partagées avec la commande (ssh-keygen -t rsa) et après un peu de shell scripting via le Kernel, voici donc une tâche Rake muy buena :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#Attention, n'utilisez pas ce script si vous ne le comprenez pas! #Nécessite d'avoir sftp d'installé et une clé partagée avec le serveur desc "sftp command to customize" task :sftp do #server address server_address = "you@example.com" #sftp command source_dir = "#{RAILS_ROOT}/dir_to_upload/*" destination_dir = "remote_dir/" command = "put "+ source_dir #sftp call call = "sftp -b /dev/stdin" + " " + server_address + ":" + destination_dir + " <<EOF\n" + command + "\nquit\nEOF\n" puts call system(call) end |
Pour ceux qui ne connaissent pas sftp, voici les principales commandes qu'il supporte :
- cd : changement de répertoire distant.
- lcd : changement de repertoire local.
- ls : liste des fichiers distants.
- lls : liste des fichiers locaux.
- put : upload de fichier.
- quit : fin de la connection.
- get : download de fichiers.
- mget : multiple get.


Pourquoi ne pas réagir à cet article tant qu'il est encore chaud ?