Script en bash ?

Mammouth du PHP | 1776 Messages

25 sept. 2009, 10:50

Bonjour à tous,

J'aurai besoin de quelques conseils svp. Je dois toutes les heures transférer un fichier via le protocole ftp de mon local (qui est aussi accessible en ftp) vers un serveur FTP distant (ou plusieurs fichiers qui sont dans le dossier, sans bien sûr connaître son nom).

Je me demandais s'il est possible de faire ça via un script bash. J'ai pas trop envie de l'écrire en php lié à un cron, donc existe t-il un autre moyen ?
Si vous avez de la doc là dessus, ce sera bienvenu !

Merci pour votre aide.

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

25 sept. 2009, 10:54

tu peux exécuter sur ton poste (sous windows ?) un fichier bat qui comprend en fait des commandes php ou ftp régulièrement avec le planificateur de taches. Je te conseil d'ailleurs que se soit tonpsote lcoal qui fasse la connection et non l'inverse, l'adresse ftp du serveur à peut de chance de changer alors que ton poste local s'il est en dhcp lui peut changer d'adresse.
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Mammouth du PHP | 1776 Messages

25 sept. 2009, 11:02

tu peux exécuter sur ton poste (sous windows ?) un fichier bat qui comprend en fait des commandes php ou ftp régulièrement avec le planificateur de taches. Je te conseil d'ailleurs que se soit tonpsote lcoal qui fasse la connection et non l'inverse, l'adresse ftp du serveur à peut de chance de changer alors que ton poste local s'il est en dhcp lui peut changer d'adresse.
Merci pour ta réponse.

Un peu plus d'infos : Mon poste local est sous ubuntu, et c'est bien lui qui envoie les données au serveur distant (via un tunnel vpn, mais bon, ça change rien dans tout ça le vpn). Le poste local qui est sous ubuntu dispose d'une adresse ip fixe sur le réseau, le tout connecté sur internet via une ip fixe.

J'ai tilté que l'on pouvait créer un script bash pour iptables, donc je me demandais si on pouvait faire pareil pour effectuer d'autres actions et l'éxécuter à intervalles réguliers.

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

25 sept. 2009, 11:04

Mon poste local est sous ubuntu...

J'ai tilté que l'on pouvait créer un script bash pour iptables, donc je me demandais si on pouvait faire pareil pour effectuer d'autres actions et l'éxécuter à intervalles réguliers.
Je laisserai les pro linux répondre :P
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

ViPHP
ViPHP | 4039 Messages

25 sept. 2009, 11:32

On peut tout scripter en bash (ou en tout autre langage de script).

Ou plutôt, sous linux/unix, on peut tout automatiser assez facilement, puisque tout ce fait (ou presque) en texte.
On peut même scripter Gimp pour faire des conversions par exemple, à la volée. Faut y aller pour faire ça avec photoshop...
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ViPHP
ViPHP | 1136 Messages

25 sept. 2009, 12:03

Slt ,

Un petit script bash ou shell au choix, ce ce type :

Code : Tout sélectionner

#!/bin/bash ftp -vni x.x.x.x <<FINFTP user loginuser passworduser put "monfichieràuploader" bye FINFTP
Hop , tu le rends executable , et tu le met en tache cron à ta convenance ..
te reste plus qu'à gérer un fichier de log pour voir si tout ce passe bien .. :-)

Good luck ,

Ch.

Mammouth du PHP | 1776 Messages

25 sept. 2009, 12:08

Slt ,

Un petit script bash ou shell au choix, ce ce type :

Code : Tout sélectionner

#!/bin/bash ftp -vni x.x.x.x <<FINFTP user loginuser passworduser put "monfichieràuploader" bye FINFTP
Hop , tu le rends executable , et tu le met en tache cron à ta convenance ..
te reste plus qu'à gérer un fichier de log pour voir si tout ce passe bien .. :-)

Good luck ,

Ch.
Merci bcp ;)

Je vais rechercher ce que je peux greffer autour en fichier log, c'est déjà beaucoup moins obscur d'un coup !
Autre petite question : comment liste les fichiers dans un dossier ? Y'a t-il une référence des fonctions pouvant être ajoutée en bash ? Le but serait d'envoyer tous les fichiers d'un dossier, qu'importe leur nom, sur le ftp de destination.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 sept. 2009, 12:12

et du côté de rsync ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 1136 Messages

25 sept. 2009, 12:16

Tu peux tout mettre dans un script bash ..

tout ce que tu peux faire dans un terminal , tu peux le mettre dans un script bash ..

Pour le reste comment lister les fichiers ect ect ..

je te renvois vers un des nombreux sites traitants du sujet : http://www.linux-pour-lesnuls.com/shell.php

Sinon , je serais toi , ( si c'est possible ) je créerais une archive du rep que tu veux uploader avant tout ( automatisé dans ton script biensure ), ce qui simplifie l'upload , et prend moins de temps du fait de la compression .

Bon amusement :-)

Ch.

ViPHP
ViPHP | 3300 Messages

25 sept. 2009, 12:57

rsync ou ftp, c'est kif kif, ftp est quand meme protocolairement fait pour transférer des fichiers. mais rsync est bien aussi, surtout qu'il évite le transfert des fichiers inutiles mais c'est aussi jouable comme feature avec ftp, les deux sont scriptables et la périodicité se gère avec cron. crontab -e pour éditer en tant que user qui doit exécuter le script, et apr-s la périodicité se gère de la façon suivante par exemple c'est assez simple et en meme temps assez puissant:

# Chaque jour, 5 minutes après Minuit
5 0 * * * script
Fait du php depuis que ca existe ou presque :)

Mammouth du PHP | 1776 Messages

25 sept. 2009, 14:35

Erreur de débutant très certainement mais je ne trouve pas comment m'en sortir sans à chaque fichier à envoyer connecter puis déconnecter :

Code : Tout sélectionner

#!/bin/bash cd /home/mon_rep/ ftp -vni 192.168.0.2 << END_SCRIPT quote USER mon_user quote PASS mon_pass for file in ma_syntaxe* do put $file done bye END_SCRIPT
la boucle est interprétée dans la commande ftp...comment sortir cela ?

Mammouth du PHP | 1776 Messages

25 sept. 2009, 15:48

Trouvé !

Code : Tout sélectionner

#!/bin/sh USER=myuser PASSWD=mypass filenum=$1 x=0 echo "open 159.167.95.199 user $USER $PASSWD binary cd pacsftp01" > /tmp/ftp.$$ while [ $x -lt $filenum ] do echo "put test.txt delete test.txt" >> tmp/ftp.$$ x=`expr $x + 1` done echo "quit" >> /tmp/ftp.$$ ftp -ivn < /tmp/ftp.$$ echo $x files transferred rm /tmp/ftp.$$

Mammouth du PHP | 1776 Messages

30 sept. 2009, 10:34

Bon, ça m'énerve... Je tourne en rond avec crontab !

Code : Tout sélectionner

sudo crontab -l * * * * * root /home/mon_rep/bash/bash_mon_client.sh >> /home/mon_rep/bash/cron.log

Code : Tout sélectionner

#!/bin/bash echo "Lancement du BASH @ `date`" >> /home/mon_rep/bash/logs_bash_mon_client/`date +%Y%m%d` cd /home/mon_rep/external_files/mon_client/envoi_client/ if [ -e ficWCCA011* ] then echo "open 192.168.0.22 quote USER user quote PASS password" > /tmp/ftp.$$ for file in ficWCCA011* do echo "put $file" >> /tmp/ftp.$$ echo "put $file" >> /home/mon_rep/bash/logs_bash_mon_client/`date +%Y%m%d` done echo "bye" >> /tmp/ftp.$$ ftp -ivn < /tmp/ftp.$$ rm /tmp/ftp.$$ for file in ficWCCA011* do mv $file ../traite/ done else echo "Aucun fichier trouve" >> /home/mon_rep/bash/logs_bash_mon_client/`date +%Y%m%d` fi echo "Fin du BASH @ `date`" >> /home/mon_rep/bash/logs_bash_mon_client/`date +%Y%m%d` echo "" >> /home/mon_rep/bash/logs_bash_mon_client/`date +%Y%m%d`
Le fichier cron.log est bien créé toutes les minutes et est vide. Mon fichier de log bash lui n'est pas impacté, et les fichiers présents non transférés ce qui pour moi signifie que le script ne s'exécute pas. Lorsque je tape "sudo /home/mon_rep/bash/bash_mon_client.sh", mon script s'exécute correctement.
Les droits sur mon fichier sont -rwxr-xr-x

Où pourrait se situer le problème ? Note : je suis sous ubuntu x64

Mammouth du PHP | 1776 Messages

30 sept. 2009, 10:40

Bon, ça m'énerve... Je tourne en rond avec crontab !

Code : Tout sélectionner

sudo crontab -l * * * * * root /home/mon_rep/bash/bash_mon_client.sh >> /home/mon_rep/bash/cron.log
Le fichier cron.log est bien créé toutes les minutes et est vide. Mon fichier de log bash lui n'est pas impacté, et les fichiers présents non transférés ce qui pour moi signifie que le script ne s'exécute pas. Lorsque je tape "sudo /home/mon_rep/bash/bash_mon_client.sh", mon script s'exécute correctement.
Les droits sur mon fichier sont -rwxr-xr-x

Où pourrait se situer le problème ? Note : je suis sous ubuntu x64
Je me réponds à moi même...
J'ai refais mon cron tel quel : * * * * * /home/mon_rep/bash/bash_mon_client.sh
Et là, ç fonctionne ! Une idée du problème ? J'étais parti d'un fichier créé sous mon user local exécuté via root en cron à un fichier avec tous les droits d'éxecution et un cron sans précision de l'utilisateur qui l'exécute... Je comprends plus tout là...