# Petit script bash pour ftp

**URL:** <https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946 "2016-02-21T03:53:07Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/1 "2016-02-21T03:53:07Z")

</div>

Salut,  
Je voudrais votre avis sur ce script:

Objectif, envoyer sur un ftp les sauvegardes du jour.  
J’ai fait une boucle, mais j’ai l’impression qu’il doit y avoir plus simple… ?  
Le ftp se déconnecte et se reconnecte à chaque fichier, ça me semble un peu… trop…

[code]#!/bin/bash

# Variables

DESTSITE="/var/backup/sites/“  
DATE=”$(date +%F)"  
FTP\_HOST="quelquepart"  
FTP\_USER="quelquun"  
FTP\_PASS=“quelquechose”

# Liste des fichiers du jour

cd $DESTSITE  
ls \*$DATE.tar.gz \> sites

# Début boucle

```
    while read ligne
    do
    set $(echo $ligne)
    FICHIER=$(eval echo $1)

```

# Connexion au ftp et envoi de $FICHIER

ftp -in \<\<EOF  
open ${FTP\_HOST}  
user ${FTP\_USER} ${FTP\_PASS}  
bin  
verbose  
prompt  
put $FICHIER  
bye  
EOF

# Fin boucle

```
    done < sites

```

# nettoyage liste

rm sites

exit[/code]

Merci.

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/2 "2016-02-21T03:53:08Z")

</div>

Déplacer la boucle à l’intérieur de la commande FTP, peut-être ? Et accessoirement, t’as pas besoin du fichier temporaire.  
Vu que c’est du bash tu peux faire quelque chose dans ce goût là (non testé… pour tester tu peux remplacer le ftp -in par un cat) :

[code]#!/bin/bash

# Variables

DESTSITE="/var/backup/sites/“  
DATE=”$(date +%F)"  
FTP\_HOST="quelquepart"  
FTP\_USER="quelquun"  
FTP\_PASS=“quelquechose”

# Liste des fichiers du jour

cd $DESTSITE

# Connexion au ftp et envoi des fichiers

ftp -in \<(  
echo "open ${FTP\_HOST}"  
echo "user ${FTP\_USER} ${FTP\_PASS}"  
echo "bin"  
echo "verbose"  
echo “prompt”

ls -1 \*$DATE.tar.gz | while read FICHIER; do  
echo "put ${FICHIER}"  
done

echo “bye”  
)

exit[/code]

La partie set/eval est inutile également, tu peux faire juste un bête echo “put ${FICHIER}” à la place maintenant que le ls utilise -1.

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/3 "2016-02-21T03:53:08Z")

</div>

Salut,

> [@syam](#):
>
> Déplacer la boucle à l’intérieur de la commande FTP

Je ne savais pas si c’était possible…  
Je testerais ça (plus tard, là j’en ai plein la tête…)

Merci.

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/4 "2016-02-21T03:53:08Z")

</div>

La clé, c’est la syntaxe \<(…) qui fonctionne exactement comme $(…) à une différence près : la sortie des commandes “…” est redirigée vers l’entrée standard de la même manière qu’une redirection \<fichier redirige le contenu du fichier vers l’entrée standard.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/5 "2016-02-21T03:53:08Z")

</div>

Ça me fait penser à ça : [pour-les-scripts-c-est-ici-t3548-125.html#p218512](https://www.debian-fr.org/pour-les-scripts-c-est-ici-t3548-125.html#p218512) (note que je n’ai que survolé très rapidement ton script).

Sinon pour faire vraiment vraiment simple, il y a lftp.

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/6 "2016-02-21T03:53:11Z")

</div>

bonsoir,

2 propositions :

1. en utilisant ftp :

```auto
#!/bin/bash

# Variables
DESTSITE="/var/backup/sites/"
DATE="$(date +%F)"
FTP_HOST="quelquepart"
FTP_USER="quelquun"
FTP_PASS="quelquechose"

shopt -s nullglob
FICHIERS=( "${DESTSITE}"/*${DATE}.tar.gz )

(( ${#FICHIERS[@]} > 0 )) && ftp -in <<EOF
  open ${FTP_HOST}
  user ${FTP_USER} ${FTP_PASS}
  bin
  verbose
  prompt
  $(printf "put %s\n" "${FICHIERS[@]}")
  bye
EOF

exit
```

1. En utilisant lftp et sa commande mput

```auto
#!/bin/bash

# Variables
DESTSITE="/var/backup/sites/"
DATE="$(date +%F)"
FTP_HOST="quelquepart"
FTP_USER="quelquun"
FTP_PASS="quelquechose"

shopt -s nullglob
FICHIERS=( "${DESTSITE}"/*$DATE.tar.gz )

(( ${#FICHIERS[@]} > 0 )) && lftp -c "open ftp://${FTP_USER}:${FTP_PASS}@${FTP_HOST}; mput ${DESTSITE}/*${DATE}.tar.gz"
```

edit : je n’ai pas testé en ftp mais ça marche en sftp… d’ailleurs, si tu veux changer de procotole, tu as simplement à changer ftp par sftp et c’est good.

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/7 "2016-02-21T03:53:12Z")

</div>

Salut,  
Merci à vous.

J’ai du faire un mixte de lftp et ftp.  
J’ai besoin de renommer/déplacer un répertoire, je n’ai pas trouvé avec lftp.

J’ai un souci avec ftp qui n’efface que 3 fichiers sur un delete \*  
Du coup j’efface avec lftp et je déplace avec ftp…

Le principal est que j’arrive à mon objectif. 😊

@Michel: j’avais utilisé ton script pendant un moment.  
Mais c’est du Perl, impossible pour moi de bidouiller dedans ou de l’inclure dans mon script bash… Je n’ai pas les connaissances suffisantes.

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/8 "2016-02-21T03:53:13Z")

</div>

[quote=“lol”]J’ai besoin de renommer/déplacer un répertoire, je n’ai pas trouvé avec lftp.

J’ai un souci avec ftp qui n’efface que 3 fichiers sur un delete \*  
Du coup j’efface avec lftp et je déplace avec ftp…  
[/quote]  
man lftp ![:snooty:](https://www.debian-fr.org/uploads/default/original/1X/7733f25880e690d75c39aa9a7c7798ed563873e1.gif "Snooty")

[code] mv file1 file2

```
   Rename file1 to file2.

```

[/code]

sinon +1 pour lftp

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/9 "2016-02-21T03:53:13Z")

</div>

Salut,  
Je suis dans les mans de ftp et lftp depuis 6h30 (chez moi, soit 4h30 chez vous)

[code] mv file1 file2

Rename file1 to file2.  
[/code]

Malheureusement ça ne fonctionne pas pour les répertoires.

Alors qu’avec ftp un simple:

```auto

```

Fonctionne.

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/10 "2016-02-21T03:53:13Z")

</div>

Tu as la commande mkdir qui te permettra de créer ton dossier jour-1. Il te faudra ensuite déplacer tes fichiers.  
Si le dossier jour-1 existe déjà (ce dont je ne pense pas car sinon tu ne ferais pas un rename), il y a la commande rmdir pour le supprimer.

😉

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/11 "2016-02-21T03:53:13Z")

</div>

Re,  
Merci, oui, j’avais trouvé.

Avec lftp je vide et supprime jour-1 (mrm rmdir)  
avec ftp je déplace jour en jour-1 recrée jour et fait ma sauvegarde. (rename mkdir put)

J’aurais préféré faire tout avec une seule commande, mais le delete \* ou le mdelete \* de ftp ne fonctionne pas bien pour je ne sais quelle sombre raison. Il efface trois fichiers et s’arrête. ![:017](https://www.debian-fr.org/uploads/default/original/1X/7bbea83f89515ab7c7a738dddb86c4d4f140bd13.gif "reflechit")

Tout ce ci est loin d’être parfait, mais j’ai quand même la satisfaction d’obtenir ce que je veux…

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/12 "2016-02-21T03:53:14Z")

</div>

Normalement, tu dois pouvoir tout faire avec lftp. d’autant plus que tu peux préciser le dossier de destination avec mput (option -O).

Mais si tu n’y arrives pas, je te conseille plutôt de réaliser ces traitements sur les fichiers/dossiers en ssh que de fais ça en ftp.

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/13 "2016-02-21T03:53:14Z")

</div>

[quote=“Totor”]Normalement, tu dois pouvoir tout faire avec lftp. d’autant plus que tu peux préciser le dossier de destination avec mput (option -O).

Mais si tu n’y arrives pas, je te conseille plutôt de réaliser ces traitements sur les fichiers/dossiers en ssh que de fais ça en ftp.[/quote]

Salut,  
“Malheureusement” (enfin… ça va quand même) OVH m’offre un ftp gratuit (100Go). Donc c’est cool pour un backup…  
Comme ce n’est pas accessible depuis l’extérieur, c’est plutôt sécurisé.

J’ai mis en place un autre backup sur un serveur aux états unis, celui-là se fait avec scp + clef, c’est d’ailleurs plus simple que le ftp…

J’ai mis en place les crons, plus qu’a attendre une semaine de voir si mes scripts tiennent la route…

J’ai épluché le man de lftp et je n’ai pas trouvé (seulement comment déplacer des fichiers): mv  
lftp est surtout très axé “mirror”… 😉

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/14 "2016-02-21T03:53:15Z")

</div>

J’ai encore une question…

[quote=“Totor”]

[code]  
#!/bin/bash

# Variables

DESTSITE="/var/backup/sites/“  
DATE=”$(date +%F)"  
FTP\_HOST="quelquepart"  
FTP\_USER="quelquun"  
FTP\_PASS=“quelquechose”

shopt -s nullglob  
FICHIERS=( “${DESTSITE}”/\*${DATE}.tar.gz )

(( ${#FICHIERS[@]} \> 0 )) && ftp -in \<\<EOF  
open ${FTP\_HOST}  
user ${FTP\_USER} ${FTP\_PASS}  
bin  
verbose  
prompt  
$(printf “put %s\n” “${FICHIERS[@]}”)  
bye  
EOF

exit  
[/code][/quote]

Je n’arrive pas à envoyer des infos dans les logs à partir de “l’intérieur” de la boucle ftp… (entre $(printf… et bye)  
Quelqu’un à une idée de la façon de procéder ?

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/15 "2016-02-21T03:53:15Z")

</div>

C’est bon, j’ai trouvé.

Je suis obligé de tout prendre:

> [@](#):
>
> (( ${#fichiers[@]} \> 0 )) && ftp -in \<\<EOF \>\> $LOGFILE

Puis je «&nbsp;grep&nbsp;»…

```auto
grep "local\|successfully" /var/backup/logs/2011-11-26-backuplog.txt
```

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/16 "2016-02-21T03:53:19Z")

</div>

[quote=“lol”]  
Malheureusement ça ne fonctionne pas pour les répertoires.

Alors qu’avec ftp un simple:

```auto

```

Fonctionne.[/quote]Je ne comprend pas car je viens de tester lftp et ca fonctionne.  
mv pdf lib/ me déplace le dossier pdf dans lib/  
mv pdf pdf2 me renomme pdf en pdf2

Je vais peut être relire le fil car il y a un truc que je n’ai pas compris.

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/17 "2016-02-21T03:53:22Z")

</div>

Salut,

[quote=“limax”]  
mv mv pdf lib/ me déplace le dossier pdf dans lib/  
mv pdf pdf2 me renomme pdf en pdf2[/quote]

Il faut que je refasse un essai alors…  
mv mv deux fois, c’est normal ? Pas de slash au dossier /pdf dans la commande ?

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/18 "2016-02-21T03:53:27Z")

</div>

Salut,  
J’ai fini par comprendre la source de mes problèmes d’effacement/déplacement…

> [@](#):
>
> rm: L’accès a échoué : 550 Could not delete /jour-1/isp/\*: No such file or directory

Je m’arretais à la dernière partie du message: No such file or directory  
Alors que c’est la première partie qui aurait du me mettre sur la voie: 550

C’est un problème de droits.  
J’avais créé des répertoires avec ftp dans mc (midnight commander) ouvert par root…

J’ai recrée les répertoires avec lftp, le problème est réglé, et effectivement mv fonctionne aussi pour les répertoires.

Merci.

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/19 "2016-02-21T03:53:33Z")

</div>

[quote=“lol”]Salut,  
mv mv deux fois, c’est normal ? Pas de slash au dossier /pdf dans la commande ?[/quote]  
C’est parce que je bégaye.

Si le problème est réglé tant mieux.

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 3:53 UTC](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946/20 "2016-02-21T03:53:37Z")

</div>

[quote=“limax”][quote=“lol”]Salut,  
mv mv deux fois, c’est normal ? Pas de slash au dossier /pdf dans la commande ?[/quote]  
C’est parce que je bégaye.

Si le problème est réglé tant mieux.[/quote]

![:005](https://www.debian-fr.org/uploads/default/original/1X/cdd45e7dd754015ac5291329b843a2851a0d4fe8.gif "chaud")

Je me suis fait avoir aussi avec prompt. Il m’a fallut du temps pour percuter…  
Il (le mode interactif) est désactivé par défaut, et je le réactivais à chaque fois… Résultat les “delete” et autres opérations en masse avortaient…

[Page suivante](https://www.debian-fr.org/t/petit-script-bash-pour-ftp/34946.md?page=2)
