IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unix Discussion :

Commande SFTP Unix


Sujet :

Unix

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 72
    Points : 46
    Points
    46
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #!/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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $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

  2. #2
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Redirige la sortie d'erreur (2) dans la sortie standard (1) :

    s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 72
    Points : 46
    Points
    46
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #!/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 ?


  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Citation Envoyé par gdev7 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #!/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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # .....
    !rm *.dup
    EOF
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 72
    Points : 46
    Points
    46
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #!/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 ...

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    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.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 72
    Points : 46
    Points
    46
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    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....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Reports 6i en ligne de commande sous unix
    Par karamasov59 dans le forum Reports
    Réponses: 0
    Dernier message: 17/01/2008, 10h32
  2. commande sous unix (liens)
    Par acacia dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/12/2007, 12h22
  3. Commande sftp avec ACCESS VBA
    Par pocabe dans le forum Sécurité
    Réponses: 1
    Dernier message: 25/08/2007, 12h10
  4. [Système]commandes linux / unix depuis java
    Par msiramy dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 20/03/2007, 11h29
  5. Execution d'une commande Shell Unix
    Par boubakary dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 17/06/2006, 20h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo