Petit script bash pour ftp

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.

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.

Salut,

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

Merci.

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.

Ça me fait penser à ça : 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.

bonsoir,

2 propositions :

  1. en utilisant ftp :
#!/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
#!/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.

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. :blush:

@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.

[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:

[code] mv file1 file2

   Rename file1 to file2.

[/code]

sinon +1 pour lftp

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:

Fonctionne.

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.

:wink:

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

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

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=“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”… :wink:

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 ?

C’est bon, j’ai trouvé.

Je suis obligé de tout prendre:

Puis je “grep”…

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

Alors qu’avec ftp un simple:

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.

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 ?

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

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.

[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=“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

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…