ftputil Automatiser des commandes FTP par script.


La lecture ce matin de l'excellent blog de Nicolargo sur le montage de son espace FTP en local: http://blog.nicolargo.com/2011/08/mounter-son-espace-de-sauvegarde-ftp-en-local-sous-debian.html?utm_source=twitterfeed&utm_medium=twitter
 m'a donné l'idée de bloger ce post.

Je backup toutes les nuits mes différents DomU Xen de ma DediboxQC (une dizaine de VM), un des processus de ma backup est bien sur l'externalisation
J'externalise sur l'espace FTP Online de 200Go

Toutes les nuits je transfert environ: 40Go de données sur mon espace FTP.


La méthode de Nicolargo est séduisante, car elle permet de gérer son espace FTP comme un repertoire local et donc utiliser les commandes unix de base ( cp, mv etc...)

Pour ma part j'ai préféré scripter les commandes FTP avec de me faire une commande FTP "a tout faire"

Le script
 
voici mon script simple et très perfectible:

#!/bin/bash
#ftputil
###FTPUTIL##Antony Martineau 2010
################################
ftpserver="dedibackup-vit.online.net"
login="sd-25168"
password="*****"
###############################

for i in $*; do
if [ "$i" = "--put" ]; then
putparam=$(echo $* | gawk -F'--put' '{print $2}' | cut -d" " -f2)
param=$(echo $param | sed -r 's/(^| )--put( |$)/\1/g' | sed -r 's:(^| )'$scriptbefore'( |$):\1:g' | sed 's/[ \t]*$//')
echo -e "user $login $password\\nls\\nput $putparam\nquit" | ftp -n $ftpserver

elif [ "$i" = "--get" ]; then
getparam=$(echo $* | gawk -F'--get' '{print $2}' | cut -d" " -f2)
param=$(echo $param | sed -r 's/(^| )--get( |$)/\1/g' | sed 's/[ \t]*$//')
echo -e "user $login $password\\nls\\nget $getparam\nquit" | ftp -n $ftpserver
elif [ "$i" = "--ls" ]; then
lsparam=$(echo $* | gawk -F'--ls' '{print $2}' | cut -d" " -f2)
param=$(echo $param | sed -r 's/(^| )--ls( |$)/\1/g' | sed 's/[ \t]*$//')
echo -e "user $login $password\\nls\nquit" | ftp -n $ftpserver
elif [ "$i" = "--del" ]; then
delparam=$(echo $* | gawk -F'--del' '{print $2}' | cut -d" " -f2)
param=$(echo $param | sed -r 's/(^| )--del( |$)/\1/g' | sed 's/[ \t]*$//')
echo -e "user $login $password\\ndel $delparam\nquit" | ftp -n $ftpserver
fi
done


Comme on peut le voir le script est simple:
Il me permet simplement d'appeler la commande ftputil avec ses arguments

ftputil --ls pour lister
ftputil --put pour uploader
ftputil --get pour downloader
ftputil --del pour supprimer

Ainsi dans mes scripts de backups je n'ai plus qu'a appeler ma commande pour transferer mes fichiers..
ftputil --put la_backup_de_mon_domu.lzo


Pourquoi
 
Je connaissai déjà curlftpfs et ses avantages, mais j'ai préféré ma méthode car elle est plus performante à mon gout.

il suffit de faire un test de transfert pour s'en convaincre:

  • Avec curlftpfs
xen-dedi:/stock # mount | grep curlftpfs

curlftpfs#ftp://sd-25168:******@dedibackup-vit.online.net/ on /backup
type fuse (rw,nosuid,nodev)

Mon ftp est bien monté sur mon /backup je test un transfert d'un iso ubuntu sur le montage

xen-dedi:/stock # cp /stock/ubuntu-10.04.2-server-amd64.iso /backup/ubuntu-10.04.2-server-amd64.iso


Je monitore en même temps le débit réseau sur mon interface eth0

Real time statistics for eth0 (refreshed every 1 sec)



Link encap:Ethernet  HWaddr B8:AC:6F:97:A3:A2 

inet addr:88.190.14.87  Bcast:88.190.14.255 
Mask:255.255.255.0

inet6 addr: fe80::baac:6fff:fe97:a3a2/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:9806331 errors:0 dropped:0 overruns:0 frame:0

TX packets:53750134 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:1503239144 (1433.6MiB)  TX bytes:78790434959 (75140.4MiB)

Interrupt:16 Memory:da000000-da012800



RX packets per second:  18645.00pkt/s

RX average packet size: 70.14bytes/pkt

RX throughput:         
10.46Mb/s (1.24MiB/s)



TX packets per second:  35514.00pkt/s

TX average packet size: 1462.33bytes/pkt

TX throughput:         415.46Mb/s (49.52MiB/s)
  on obtient une moyenne de 49Mo/s ce qui est tout de même très acceptable.


  • Avec les commandes FTP basiques
/stock/ftputil --put ubuntu-10.04.2-server-amd64.iso


Je monitore en même temps le débit réseau sur mon interface eth0ce qui est tout de même très acceptable

Real time statistics for eth0 (refreshed every 1 sec)



Link encap:Ethernet  HWaddr B8:AC:6F:97:A3:A2 

inet addr:88.190.14.87  Bcast:88.190.14.255 
Mask:255.255.255.0

inet6 addr: fe80::baac:6fff:fe97:a3a2/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:10707550 errors:0 dropped:0 overruns:0 frame:0

TX packets:55902209 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:1566805384 (1494.2MiB)  TX bytes:82030865865 (78230.7MiB)

Interrupt:16 Memory:da000000-da012800



RX packets per second:  3459.00pkt/s

RX average packet size: 70.18bytes/pkt

RX throughput:         
1.94Mb/s (237.0KiB/s)



TX packets per second:  6928.00pkt/s

TX average packet size: 1509.71bytes/pkt

TX throughput:         83.67Mb/s (9.97MiB/s)

on obtient une moyenne de 84Mo/s.