Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Unix

Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix

Réponse
 
Outils de la discussion
Vieux 12/09/2008, 15h10   #1 (permalink)
Futur Membre du Club
 
Date d'inscription: octobre 2007
Messages: 39
Par défaut Commande SFTP Unix

,

Je dois faire un script Unix qui utilise la commande SFTP.

Mon but est de déplacer un certain type de fichiers d'un répertoire à un autre.


Mon script à cette tête la :
Code :
#!/usr/bin/ksh

touch log.txt

sftp $1@$2 << EOF >> log.txt
cd $3
mget *.dup
rm *.dup
cd $4
mput *.dup
bye
EOF >> log.txt

rm ./*.dup >> log.txt
Avec en paramètre du script :
Code :
$1 et $2 -> pour pouvoir se connecter / se logguer
$3         -> le répertoire où je récupère les fichiers
$4         -> le répertoire où je dépose les fichiers récupéré
Explication :
J'ai créer un fichier de log pour ne pas avoir de message sur ma sortie standard, ce script fait exactement ce que je veux mais malheuresement si une erreur intervient ('dossier non existant', 'pas de fichiers présent de ce type', ...), des messages apparaissent sur la sortie standard et non pas dans le fichier de log ....... This is my problem.

Je voudrais simplement mettre tous les messages que génère ce script dans le fichier de log ... ca parait si bête, mais je n'arrive pas.

Si vous avez une tite idée en tête, merci à vous.

PS :
Tchaoo
gdev7 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 12/09/2008, 16h53   #2 (permalink)
Membre éprouvé
 
Avatar de BlaireauOne
 
Date d'inscription: mars 2007
Localisation: Toulouse
Messages: 471
Par défaut

Redirige la sortie d'erreur (2) dans la sortie standard (1) :

s
Code :
ftp $1@$2 << EOF >> log.txt 2>&1
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 12/09/2008, 17h41   #3 (permalink)
Futur Membre du Club
 
Date d'inscription: octobre 2007
Messages: 39
Par défaut Commande SFTP Unix

Re,

Bravo bravo, j'avais trouvé une solution tordu sinon. J'appelais ce script à partir d'un autre script avec à la fin de cet appel : >> log.txt 2>/dev/null.
Ta solution est meilleur

Par contre, j'ai remarqué un 2ème problème à ce script, c'est que avec ceci donc :
Code :
#!/usr/bin/ksh

echo "******* Starting Script *******" >> log.txt

sftp $1@$2 << EOF >> log.txt 2>&1
cd $3
mget *.dup
rm *.dup
cd $4
mput *.dup
bye
EOF

rm ./*.dup

echo "******* Ending Script *******" >> log.txt

exit 0
Il n'effectue JAMAIS, le bout de code qui suit la fin de connexion SFTP. J'ai tenté d'insérer le code avant le 2ème 'EOF', mais ça n'as pas marché! J'ai essayé de faire 'quit' au lieu de 'bye', résultat idem.

Une idée ?

gdev7 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/09/2008, 11h14   #4 (permalink)
Modérateur
 
Avatar de gangsoleil
 
Date d'inscription: mai 2004
Localisation: Grenoble
Âge: 28
Messages: 2 642
Par défaut

Bonjour,

Citation:
Envoyé par gdev7 Voir le message
Code :
#!/usr/bin/ksh

echo "******* Starting Script *******" >> log.txt

sftp $1@$2 << EOF >> log.txt 2>&1
cd $3
mget *.dup
rm *.dup
cd $4
mput *.dup
bye
EOF

rm ./*.dup

echo "******* Ending Script *******" >> log.txt

exit 0
Il n'effectue JAMAIS, le bout de code qui suit la fin de connexion SFTP. J'ai tenté d'insérer le code avant le 2ème 'EOF', mais ça n'as pas marché! J'ai essayé de faire 'quit' au lieu de 'bye', résultat idem.
Un rm avec chemin relatif dans un script est à proscrire. Certes, aujourd'hui tu te souviens que ce script fait un rm, et qu'il ne faut donc pas l'exécuter n'importe où. mais dans 3 mois, quand tu le lanceras pour savoir ce qu'il fait, tu ne le lanceras pas forcément de là où tu le souhaitais, et tu risques d'avoir des déconvenues avec le rm.
Il est conseillé de le protéger avec une phrase du genre "Voulez-vous supprimer les fichier *.dup ?", puis une lecture de réponse (Y/N), avec comme valeur par défaut (si autre chose que Y ou N est tapé) la non-suppression.

Sinon, si tu veux effacer les fichiers dans le code exécuté par sftp, il faut que tu indiques que la commande doit avoir une portée locale. Pour ce faire, il faut la précéder de '!' :

Code :
# .....
!rm *.dup
EOF
__________________
Non au langage SMS

Modérateur "C", "Informatique Générale & Hardware" et "Windows, Système & Logiciels"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/09/2008, 11h36   #5 (permalink)
Futur Membre du Club
 
Date d'inscription: octobre 2007
Messages: 39
Par défaut

Re bonjour les amis,

Alors, hihi, le PETIT problème ci-dessus est assez énervant en fait, mais la solution a été trouvé. En fait à la ligne 'EOF' (celle après le bye), il y avait un espace en trop ... Qu'est-ce que je vous voulez que je vous disent ???

Bon voici sa petite tête maintenant :
Code :
#!/usr/bin/ksh

echo "******* Starting Script *******" >> log.txt

echo "Connection to $1@$2" >> log.txt
sftp $1@$2 << EOF >> log_sftp.log 2>&1
cd $3
mget *.failed
rm *.failed
cd $4
mput *.failed
quit
EOF
echo "Bye connection sftp" >> log.txt

rm ./*.failed
rm log_sftp.log

echo "******* Ending Script *******" >> log.txt

exit 0
Et maintenant, pour finir, the LAST problem is (roulement de tambour ...), j'aimerais et je voudrais faire en SFTP, "prendre tous les fichiers qui n'ont pas ce masque".

Jusqu'à maintenant je ne prenais les fichiers que d'un certain type et maintenant je voudrais prendre les fichiers autres que le type spécifier dont voici le masque : /c[a-f]t.\D{1,5}\d{1,3}.\d{14}.\d{14}/ (j'espère que les masques marchent sous unix )

Allez, A vous, et je vous tient au courant si j'ai trouvé !!!!!!!!!!!!!

Marki encore de votre aide ...
gdev7 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/09/2008, 13h00   #6 (permalink)
Modérateur
 
Avatar de gangsoleil
 
Date d'inscription: mai 2004
Localisation: Grenoble
Âge: 28
Messages: 2 642
Par défaut

Bonjour,

Content que tu aies trouvé le soucis.

Pour ton nouveau problème, je crois me souvenir que FTP gère les méta-caractères, mais pas les expressions régulières. Je ne peux que te conseiller de faire des essais pour voir si tu arrives à jouer là dessus.
__________________
Non au langage SMS

Modérateur "C", "Informatique Générale & Hardware" et "Windows, Système & Logiciels"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/09/2008, 10h12   #7 (permalink)
Futur Membre du Club
 
Date d'inscription: octobre 2007
Messages: 39
Par défaut

Bonjour,

Voici le code final, ce n'est sans doute pas ce qui a de plus propre mais je n'ais pas eu d'autre idée.

En résumé,
-> je créer un répertoire temporaire où je vais me trouver ensuite,
-> je me connecte en SFTP,
-> je me dirige dans le répertoire voulu,
-> je prend tous les fichiers,
-> je quitte la connexion
-> je supprime tous les fichiers qui correspond à un certain masque,
-> je fais une boucle, pour chaque fichier se connecter en SFTP, put le fichier dans le repertoire voulu et l'effacer en local
-> fin de boucle, effacer le repertoire temporaire

NB : Je ne fais pas un "mput" sans boucle, car je voulais, dans mes logs, savoir quel fichier je transférait.

Code :
LOG_FILE_SFTP=/tmp/sftp.log
LOG_FILE=/tmp/logScript.log

mkdir ./tmpSFTP

cd ./tmpSFTP

echo "Connection with $1@$2" >> $LOG_FILE
sftp $1@$2 << EOF >> $LOG_FILE_SFTP 2>&1
!echo "Check in $3 directory" >> $LOG_FILE
cd $3
mget *
quit
EOF

for FILE in `find /tmp/tmpSFTP/ -type f | grep -e "^\\./c[af]t\\.[a-z]\\{1,5\\}[0-9]\\{1,3\\}\\.[0-9]\\{14\\}\\.[0-9]\\{14\\}$"`
do
    rm $FILE
done

for FILE in `find /tmp/tmpSFTP/ -type f`
do
    echo "Move $FILE to $4 directory" >> $LOG_FILE
    sftp $1@$2 << EOF >> $LOG_FILE_SFTP 2>&1
    cd $4
    put $FILE
    cd $3
    rm $FILE
    !rm $FILE
    quit
    EOF
done

echo "Quit SFTP connection" >> $LOG_FILE

cd ..
rm -r ./tmpSFTP
Merci a vous, bon courage a tous....
gdev7 est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Unix



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide