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

Shell et commandes GNU Discussion :

Script refusant de s'exécuter correctement sur une machine


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut Script refusant de s'exécuter correctement sur une machine
    Bonjour,

    Un petite présentation avant de vous soumettre mon problème.
    Je m'appelle Vincent, j'ai 42 ans et je tente de me reconvertir professionnellement. Je suis donc en stage dans une petite entreprise très sympa ou je suis chargé de déployer une machine sous OpenVAS ( un scanner de vulnérabilités ), et de migrer de Nagios 3 vers Nagios 4.

    Voici ce qui m'amène : J'ai du écrire un script shell que devra être placer dans la crontab. Ce script, mon premier, fonctionne parfaitement avec ma machine sous Kali linux au travail, il fonctionne parfaitement à la maison, toujours sous Kali et sur la machine virtuelle de la maison ( debian 7.9, virtualbox).
    Dans l'entreprise, il devra être deployer dans une machine virtuelle sur un serveur Xen ( debian 7.9). Et là, patatra, ca ne fonctionne pas. le script plante dès qu'il faut recuperer la variable pour la target.

    Nom du script: OpenVAS

    Compatible avec: Bash

    Descriptif: Permet d'automatiser le démarrage des scans.

    Pré-requis: Openvas

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    #! /bin/bash
     
     
    cd /root
    mkdir .openvastmp
    mkdir OpenVASreports
    cd .openvastmp
     
     
    # variables à renseigner
    u=username #nom de l'utilisateur
    pw=password #pw de l'utilisateur
    cible=Openvas #nom de la cible
    hosts=ip.ci.bl.e #IP de la cible
     
    # création et récupération de la target
     
    omp -u $u -w $pw --xml='
     
      <create_target>           <!--création de la cible-->
        <name>'$cible'</name>   <!--nom de la cible -->
        <hosts>'$hosts'</hosts>   <!--ip de la cible -->
      </create_target>'
     
    target=$(omp -u $u -w $pw --get-targets | grep $cible)
    targetid=$(echo ${target:0:36})
    echo $target
    echo $targetid
     
    #pour la tâche suivante, il nous faut l'uuid d'une config
    # dans un shell : omp -u -w --get--configs
     
    # créer une variable name à utiliser dans la tâche
     
    name=$cible
    echo $name
     
    #création de la tâche
    omp --verbose -u $u -w $pw --create-task --name=$name -c daba56c8-73ec-11df-a475-002264764cea --target=$targetid
     
    #récupération de l'uuid de la tâche
    taskid=$(omp -u $u -w $pw --get-tasks= |grep New)
    taskid=$(echo ${taskid:0:36})
    echo $taskid
     
    #démarrage de la tâche
     
    omp -u $u -w $pw --xml=' 
     
      <start_task task_id="'$taskid'"/>'
     
    #on vérifie l'état de la tâche
     
    done=NotDone
    echo $done
    while test "$done" != "Done"
    do
    done=$(omp -u $u -w $pw -G $taskid | grep Done) 
    done=$(echo ${done:38:4})
    if test "$done" != "Done"
    then echo " Scan en cours " && omp -u $u -w $pw -G | grep Running
    else
    echo " Scan terminé "
    fi
    sleep 30
    done 
     
     
    #récuperation du rapport
    omp -u $u -w $pw -G $taskid > task
    awk NR==2 task > report
    reportid=$(awk '{print substr($0,3,36)}' report)
    rm task
     
     #récupérer le rapport au format XML
     #dans un shell omp -u -w -F
     
    cd /home/$u/OpenVASreports
    omp -u $u -w $pw --xml='
     
      <get_reports report_id="'$reportid'"
                   format_id="a994b278-1f62-11e1-96ac-406186ea4fc5"/>' > report_$reportid.xml
     
     
    # mail quand c'est fini
    echo " $cible-$reportid est disponible. Kali a tout fini" |mail -s " Vous avez un message de Kali " -a " From: Kali" name@name.com
     
    unset VAR
    Voilà. le script est chmoder +x dans toutes les machines. Je l’exécute en faisant ./OpenvasScript. Il fonctionne dans 3 machines sur 4 et évidement, pas sur celle qui sera utilisée.

    Je suis bien conscient des maladresses du script. Je ne sais pas programmer. Je n'ai que quelque notions de C et il y a trois semaines, je ne saivais pas réaliser un script shell. Je travaille à l'améliorer notamment et utilisant cut.
    Je pense que le script n'utilise pas le bash avec la machine à déployer ce qui fait planter le script, mais comment en être sur ?
    Peut être que cela vient d'autre chose.

    Je vous remercie pour vos pistes, je les vérifierai demain, au travail.

    Vincent

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour et bienvenue,

    Alors, quel est le message d'erreur que tu rencontres, car là, on risque d'avoir du mal à savoir ce qui ne fonctionne pas ?

    Autre question: le shebang est bien sur la première ligne et non pas sur la deuxième comme on le voit ici (d'ailleurs, on ne met pas d'espace entre le shebang et la commande) ?
    au lieu de:
    Et toujours sur la première ligne, premier caractère...
    Cordialement.

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    il y aurait pas mal de choses à dire sur le script, à commencer par le shebang comme fait remarquer disedorgue
    pour le moins la ligne 72 n'est pas correcte non plus il faut écrire awk 'NR==2' task > report avec les guillemets

    sinon comme dit ce qu'il faut c'est un message d'erreur (regarder dans le syslog et/ou en renseignant la variable MAIL= dans la configuration de crond par exemple)

    quelques points de détails/suggestions :
    • mettre mkdir -d repertoire, si le répertoire existe déjà ça évite de lever une erreur
    • utiliser simplement targetid="${target:0:36}", pas besoin de spawn un sous-processus avec un echo
    • plus généralement, plutot que d'utiliser deux lignes :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      done=$(omp -u $u -w $pw -G $taskid | grep Done)
      done=$(echo ${done:38:4})
      on pourra mettre dans une seule ligne :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      done=$(omp -u $u -w $pw -G $taskid | awk '/Done/ {print substr($0,39,4)}')

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tiki10 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #récuperation du rapport
    omp -u $u -w $pw -G $taskid > task
    awk NR==2 task > report
    reportid=$(awk '{print substr($0,3,36)}' report)
    rm task
    Bonjour
    Il faut faire très attention avec ce type de code. En effet, déjà les fichiers "task" et "report" (qui, lui, n'est d'ailleurs pas effacé) seront créés là où tu te trouves quand tu lances le script. Bon c'est vrai que dans le tien il y a des "cd" qui te déplacent dans un dossier très précis mais tu verras vite avec l'habitude que le "cd" est en général inutile ce qui te laissera alors des scripts sans "cd" mais avec création de fichiers de travail "anarchiques". Et que se passe-t-il si ton script plante avant l'effacement ?
    Or tu as un dossier "/tmp" qui sert justement aux fichiers temporaires. Et lui il est nettoyé à chaque démarrage de ton OS.
    Ensuite, il faut se souvenir qu'un script peut très bien être lancé plusieurs fois en même temps (Unix/Linux étant fondamentalement multitaches multiuser). Or si toutes ces instances vont écrire dans "task" et "rapport" au même moment gros risque de collision. Il te faut absolument prendre l'habitude de rajouter "$$" (n° du pid) dans tes noms de fichiers temporaires afin que chaque instance du script ne puisse pas polluer les fichiers des autres. Ou mieux, essayer d'éviter les fichiers temporaires autant que faire se peut (ce qui, en plus, améliore la vitesse du script vu qu'une écriture disque est très très lente). Par exemple ici, on peut tout faire sans création de fichier temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #récuperation du rapport
    reportid=$(omp -u $u -w $pw -G $taskid | awk NR==2 | awk '{print substr($0,3,36)}')
    Et sinon utilise "rm -f" au lieu de "rm". Ca exécute l'action en silence sans planter si par exemple le fichier à effacer n'existe (par hasard) plus au moment du rm...

    Et le unset VAR en fin de script est inutile vu qu'une variable (locale au script) est détruite quand le script se termine
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Bonsoir,

    Merci beaucoup pour vos retour. Je les mettrai en application dès demain. Voir ce soir
    Parce que sur la machine qui va être déployer la commande suivante ne stocke pas la variable, le script ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    target=$(omp -u $u -w $pw --get-targets | grep $cible)
    Puisque la target n'est pas créée, je ne peux pas executer la task

    Ce qui me laisse perplexe, c'est vraiment que le script s'execute sans erreur dans 3 machines sur 4.

    Merci encore

    Vincent

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Tiki10 Voir le message
    Bonsoir,

    Merci beaucoup pour vos retour. Je les mettrai en application dès demain. Voir ce soir
    Parce que sur la machine qui va être déployer la commande suivante ne stocke pas la variable, le script ne fonctionne pas
    Qu'entends-tu précisément par "la commande suivante ne stocke pas la variable" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    target=$(omp -u $u -w $pw --get-targets | grep $cible)
    D'une manière générale, il vaut mieux entourer les variables de quotes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    target=$(omp -u "$u" -w "$pw" --get-targets | grep "$cible")

    Puisque la target n'est pas créée, je ne peux pas executer la task

    Ce qui me laisse perplexe, c'est vraiment que le script s'execute sans erreur dans 3 machines sur 4.
    Peux-tu répondre à une question simple: y a-t-il un message d'erreur?
    Si oui, lequel?
    Sinon qu'observes-tu qui te fait dire que le script s'exécute avec erreur?

Discussions similaires

  1. Exécuter un script local avec environnement local sur une machine distante
    Par leon1983 dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 23/01/2013, 16h33
  2. un script pour recuperer les utilisateurs connectés sur une machine
    Par s-ehtp dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 04/04/2008, 14h17
  3. Réponses: 4
    Dernier message: 16/11/2006, 21h49
  4. Jar excutable problématique sur une autre machine
    Par lars528 dans le forum Général Java
    Réponses: 8
    Dernier message: 23/08/2006, 10h49
  5. Exécuter un fichier .BAT sur une machine distante
    Par ruff15 dans le forum Windows
    Réponses: 4
    Dernier message: 14/09/2005, 11h44

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