Tester ma connexion FTP

Résolu/Fermé
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - Modifié par pcsystemd le 29/04/2011 à 14:45
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - 5 mai 2011 à 13:47
Bonjour,

je dois depuis un script Bash récupérer un fichier sur un FTP, cela je sais faire mais ce que je ne sais pas comment faire c'est de tester ma connexion car si celle la ne se fait pas je souhaite mettre un exit 1 que la suite de mon script ne s'execute pas.

Voici mon code pour la connexion et la récupération de mon fichier :

##### Connexion et recuperation du fichier sur le FTP  ##### 
ftp -n ${FTPVER} << EOF 
quote USER ${FTSER} 
quote PASS ${FTAS} 
cd ${FTPPH} 
bin 
get monfichier monfichier 
quit 
EOF

Une idée?
Merci



L'accès au savoir est la première liberté que chaque homme devrait avoir.
A voir également:

11 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
30 avril 2011 à 01:45
Il n'y a pas longtemps j'ai eu à écrire un script shell qui mettait en jeu ftp, et je t'avoue qu'avec le client de base ftp, j'ai vite arrêté au profit de lftp, bien plus simple à manipuler et plus complet.

Pour la syntaxe :

man lftp


En shell, quelle que soit la commande que tu lances (du moment que ce n'est pas une built-in shell comme cd, history, logout etc..., ie quelque chose que which ou whereis parvient à localiser), tu peux récupérer son code d'exécution dans $?. Par convention, un programme qui se termine bien retourne 0.

En cas d'erreur il retourne une valeur dont la signification est généralement détaillée dans le man. Par exemple la commande rm retournera une valeur non nulle si le fichier passé en paramètre n'existe pas ou que les droits sont insuffisants.

man rm


Exemple :

#/bin/sh
rm toto.txt
if [ $? -eq 0 ]
then
  echo "tout va bien"
else
  echo "la commande a échoué !" >&2
fi

# Fin du programme : on quitte proprement
exit 0


Bonne chance
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
30 avril 2011 à 10:19
Salut mamie,

En shell, quelle que soit la commande que tu lances (du moment que ce n'est pas une built-in shell comme cd, history, logout etc..., ie quelque chose que which ou whereis parvient à localiser), tu peux récupérer son code d'exécution dans $?. Par convention, un programme qui se termine bien retourne 0.

A part pour ftp ;-((

$ ftp trucmachinchouette.com
ftp: trucmachinchouette.com: unknown host
ftp> bye
$ echo $?
0
$


Même si le site n'existe pas (et je suppose que s'il ne répond pas c'est pareil), ftp prend la main et attend une commande ;-(

Donc à part en utilisant des outils réseau (mais je ne sais pas lesquels), je ne vois pas comment tester la disponibilité du serveur ;-\
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 30/04/2011 à 12:28
Mmmh effectivement, tu as raison, ftp ne se comporte pas comme scp/ssh.

Bon, chez moi la commande ftp renvoie "Connection refused" quand il n'y a personne à l'autre bout du fil.

Du coup un test comme ça doit suffire :

#/bin/sh  

if [ $(ftp localhost < toto.ftp 2>&1 | grep -c refused) -eq 1 ]  
then  
    echo "Pas de serveur ftp"  
else  
    echo "Serveur ftp présent"  
fi  

exit 0  


... avec dans toto.ftp :

quit


Après on peut compléter les tests avec nmap etc... Mais de toute façon je ne suis pas persuadée que ce soit le job du script de rattraper ce genre d'erreur. Il plante et c'est tout, le message d'erreur ftp arrivera au moment d'invoquer la commande. Non ?

Autre possibilité, on travaille avec ssh et scp où l'on pourra directement tester le retour de la commande.

Bonne chance
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
30 avril 2011 à 13:23
Bon, chez moi la commande ftp renvoie "Connection refused" quand il n'y a personne à l'autre bout du fil.
Chez moi aussi mais uniquement avec du localhost ;-\

Sinon, oui ta solution semble faire l'affaire, en espérant que ça marche sur un site existant et momentanément indisponible ;-)
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
1 mai 2011 à 11:42
Chez moi aussi mais uniquement avec du localhost ;-\

Ah ben très bien c'est le test que j'avais fait -_-
J'ai donné une mauvaise piste apparemment.

Sinon, oui ta solution semble faire l'affaire, en espérant que ça marche sur un site existant et momentanément indisponible ;-)

Oui c'est pas forcément évident pour faire les tests.
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
1 mai 2011 à 14:17
MErci a vous deux . Je teste cela Lundi est je vous dis ce qu'il en est.
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
Modifié par pcsystemd le 2/05/2011 à 15:45
Bon j'ai testé mais apparement j'ai un souci car lorsque je lance le script j'ai un mot de passe qui m'est demandé ce qui ne doit pas être car j'ai bien le fichier test.ftp avec "quit" comme contenu. D'ailleurs si je mance mon script en DEBUG on peux le voir:

./monscript.sh  
+ case $DEBUG in 
++ ftp toto.mondomaine.com 
++ grep -c refused 
Password: 

Voila le contenu de mon script qui nous intéresse :

if [ $(ftp toto.mondomaine.com < test.ftp 2>&1 | grep -c refused) -eq 1 ] 
then 
   echo 'Problème de connexion au serveur FTP ' | mail -s "Problème de connexion  au serveur FTP " toto@mail.com   
   rm -f ${DIR}/test.ftp 
   exit 1 
else 
   ftp -n toto.mondomaine.com  << EOF 
   quote USER ${PUSER} 
   quote PASS ${PASS} 
   cd ${PATH} 
   bin 
   get fichier fichier 
   quit 
EOF 
fi 

Une idée?
Merci

L'accès au savoir est la première liberté que chaque homme devrait avoir.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 mai 2011 à 15:51
Essaye avec :

 egrep -c 'unknown|refused'


Mais peut être faudra-t-il gérer une autre possibilité de motif retourné en cas de non connexion ;-\
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
Modifié par pcsystemd le 2/05/2011 à 16:23
En faite je penses cela ne peux que fonctionner dans le cas ou le FTP n'est pas joignable mais si celui ci est joignable c'est a ce moment que j'ai la demande de mot de passe donc ce test ne me parait pas possible dans ce cas pour mon script.

Exemple:

ftp ftppasjoignable.com 
ftp: connect: Connection refused 
ftp> quit


la c'est ok mais si le FTP est joignable :

ftp monftp.com 
Connected to monftp.com. 
Name (monftp.com:toto): quit 
331 Password required for quit 
Password:



L'accès au savoir est la première liberté que chaque homme devrait avoir.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 mai 2011 à 16:39
C'est bizarre chez moi ça marche avec un accès à mon FTP chez "free.fr" (le fichier "fich.ftp" contient la commande "bye") :

if [ $(ftp bonne_adresse.free.fr <fich.ftp 2>&1 | egrep -c 'unknown|refused' ) -eq 1 ]; then     echo "Pas de serveur ftp"; else     echo "Serveur ftp présent"; fi
Serveur ftp présent

$ if [ $(ftp mauvaise_adresse.free.fr <fich.ftp 2>&1 | egrep -c 'unknown|refused' ) -eq 1 ]; then     echo "Pas de serveur ftp"; else     echo "Serveur ftp présent"; fi
Pas de serveur ftp

$
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
2 mai 2011 à 17:05
Curieux,

bon je vais de nouveau tester voir que ce ne soit pas moi qui fait une gaffe quelque part.

Merci
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
3 mai 2011 à 09:23
Bon définitvement , moi j'ai une demande de mot de passe, peut être que nous avons des confirgurations serveur diffèrentes ce qui pourrait expliquer que cela fonctionne pour toi et pas pour moi

Ce qui est curieux c'est que cette demande de mot de passe ne correspond a rien puisqu'il suffit que j'appui sur la touche Entrée et le script continue normalement!!!
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
3 mai 2011 à 10:20
J'éssaie de passer par un autre test en utilisant telnet :

if [ $(telnet domaine.com 21 < ${DIR}/test.telnet | egrep -c 'Connected') -eq 1 ]
then
   echo "OK"
else
   trap "echo Problème de connexion;exit 2"
   exit 1
fi

Mon souci est que lorsque la connexion ne fonctionne pas, normalement la commande :

trap "echo Problème de connexion;exit 2"


devrait faire un ctrl c (commande trap et exit 2 pour un INT) hors ce n'est pas le cas.

Une idée?

Merci
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
3 mai 2011 à 19:43
Tant que le if n'est pas évalué (et donc tant que la commande telnet n'a pas pris fin), la commande trap n'est pas évaluée. C'est donc normal.

À mon avis il faut plutôt regarder du côté de l'opérateur & qui va permettre de lancer telnet en arrière plan tandis que le fil principal va attendre par exemple 2s avec un sleep. Au bout de 2s on relève le PID de telnet avec :

pid=$(ps aux | grep telnet | grep domain.com | awk '{print $2}'


S'il est initialisé, on dégomme telnet à coup de kill.

Bon soyons clairs :

1) Ce n'est pas choquant que ton script plante si la connexion ftp ne se fait pas. Ce n'est pas à ton script de le rattraper comme je l'ai déjà dit plusieurs fois. Donc à mon humble avis, tu perds ton temps, car tu ne peux dans l'absolu pas forcément prévoir tous les motifs de plantage de commandes invoquées par ton script.

2) La solution que je te propose est "à l'arrache". En outre si des connexion telnet vers domain.com sont lancées par autre chose que ton script, c'est dommage ton script risque de les dégommer.
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
4 mai 2011 à 13:03
Merci mamiemando pour toutes tes explications. Je vais tester tout cela.
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
Modifié par pcsystemd le 4/05/2011 à 15:08
Bon en fin j'ai réussis a résoudre cette demande de mot de passe en passant tout simplement le paramètre -n de la commande FTP :

if [ $(ftp -n mondomain.com < test.ftp 2>&1 | grep -c 'unknown|refused') -eq 1 ]


Par contre j'ai un autre souci maintenant.

En effet si j'arrête mon serveur FTP et que j'essaie de me conecter en console, il y a bien :

ftp mondomaine.com  
ftp: connect: Connection refused 
ftp> quit


hors si je lance mon script en DEBUG, il ne matche pas 'refused' et donc il rentre dans mon else.

Voici le contenu de mon script de test :

if [ $(ftp -n mondomain.com < test.ftp 2>&1 | grep -c 'unknown|refused') -eq 1 ] 
then 
   echo 'Problème de connexion ' | mail -s "Problème de connexion "  mail@mail.com    
   exit 1 
else 
    echo "Ok" 
fi 
exit 0


Voici le résultat lorsque je l'execute :

./test.sh  
+ case $DEBUG in 
+ echo quit 
++ ftp -n mondomain.com 
++ grep -c 'unknown|refused' 
+ '[' 0 -eq 1 ']' 
+ echo Ok 
Ok 
+ exit 0


Une idée

Merci
L'accès au savoir est la première liberté que chaque homme devrait avoir.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
4 mai 2011 à 16:17
C'est egrep et non pas grep qu'il faut utiliser ou "grep -E" :

grep -E -c 'unknown|refused'
egrep -c 'unknown|refused'
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
5 mai 2011 à 13:47
Merci encore zipe31 pour ta disponnibilité. C'est tout bon.
0