Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petit problème de script bash

    20 février 2018 à 21:15:19

    Bonjour,

    J'aurais besoin de votre aide car j'ai un script bash pour envoyer les rapports DMARC mais cela n'a pas l'air de fonctionner.

    #!/bin/bash
     
    DB_SERVER='monserveur.mondomaine.fr'
    DB_USER='opendmarc'
    DB_PASS='password
    DB_NAME='opendmarc'
    WORK_DIR='/var/run/opendmarc'
    REPORT_EMAIL='dmarc@mondomaine.fr'
    REPORT_ORG=mondomaine.fr'
     
    mv ${WORK_DIR}/opendmarc.dat ${WORK_DIR}/opendmarc_import.dat -f
    cat /dev/null > ${WORK_DIR}/opendmarc.dat
     
    /usr/sbin/opendmarc-import --dbhost=${DB_SERVER} --dbuser=${DB_USER} --dbpasswd=${DB_PASS} --dbname=${DB_NAME} --verbose < ${WORK_DIR}/opendmarc_import.dat
    /usr/sbin/opendmarc-reports --dbhost=${DB_SERVER} --dbuser=${DB_USER} --dbpasswd=${DB_PASS} --dbname=${DB_NAME} --verbose --interval=86400 --report-email $REPORT_EMAIL --report-org $REPORT_ORG
    /usr/sbin/opendmarc-expire --dbhost=${DB_SERVER} --dbuser=${DB_USER} --dbpasswd=${DB_PASS} --dbname=${DB_NAME} --verbose

    Je signale tout de suite que c'est la première fois que j'essaie de comprendre un script et de le mettre en place donc je suis un gros zéro dans ce domaine !!

    Mais certaines choses m'interpelle :

    1) Il n'y a pas d'apostrophe fermante sur la ligne DB_PASS

    2) Il n'y a pas d'apostrophe ouvrante à la ligne REPORT_ORG

    Est ce normal ou une cause possible de plantage de ce script ?

    • Partager sur Facebook
    • Partager sur Twitter
      20 février 2018 à 21:26:23

      salut,

      tout à fait, il manque des apostrophes.

      quand un script génère des erreurs, il est bon de nous les afficher.

      sans causer d'erreurs ou d'échecs, les accolades, ici, ne sont pas utiles.
      elles ne le sont que dans le cas de concaténations de variables précédents des caractères non spéciaux pour le shell.

      et, des guillemets sont toujours les bienvenus autour des développements de variables. TOUJOURS.

      cat /dev/null est inutile, une simple redirection (sans commande >fichier) suffit pour le purger.
      on ne sait d'ailleurs pas à quoi sert cette ligne : le fichier est automatiquement générer par opendmarc ?
      la sortie (d'une) des commandes est ajouté à ce fichier ? ce qui justifierait qu'il soit purgé avant ...

      seules les variables d'environnement doivent être tout en majuscules, les variables créées/définies par un utilisateur, elles, doivent être tout en minuscules ou panachées.

      -
      Edité par dantonq 20 février 2018 à 21:31:05

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        20 février 2018 à 23:24:32

        Merci pour cette réponse.

        Dmarc sert à limiter le spam qui circule sur les serveur de mail tel que Postfix.

        Dmarc est un logiciel de contrôle et d'authentification des enregistrements SPF et Dkim (enregistrement TXT dans les DNS). Après le contrôle, dmarc applique la strategie définie par le serveur émetteur dans son enregistrement dmarc (qui est aussi un enregistrement TXT) pour accepter ou rejeter le mail. Dés lors, je suppose qu'il cré le fichier opendmarc.dat pour noter ses infos.

        Le script doit récupérer ces infos une fois par jour, les inscrire dans une BDD, créer et envoyer un rapport à l'administrateur Dmarc du serveur émetteur. Une tache cron doit donc être rajouter dans le fichier /etc/crontab.

        Je me suis déjà aperçu d'une erreur dans le fichier de configuration proposé par le tuto que j'ai suivi mais ce n'était qu'un chemin vers un fichier qui n'était pas bon.

        J'ai rajouté les deux apostrophes manquantes et maintenant, j'ai quelque chose de totalement différent en sortie bien qu'il y a manifestement des erreurs mais j'en suis peut-être la cause. Dans le tuto, pour tester que le script fonctionne, il faut faire :

        su -c "/etc/opendmarc/report-script" -s /bin/bash opendmarc

        Cela me demande un MdP mais aucun de mes MdP ne marche et j'ai un echec d'authentification.

        Pour essayer de palier à ce problème, j'ai lancer le script en tant que root

        root@monserveur:/home/moi# "/etc/opendmarc/report_script" -s /bin/bash
        

        et j'ai eu cette réponse

        opendmarc-import: started at Tue Feb 20 23:05:29 2018
        opendmarc-import: connected to database
        opendmarc-import: updating at line 19
        opendmarc-import: failed to retrieve table ID: Table 'opendmarc.requests' doesn't exist
        opendmarc-import: terminating at Tue Feb 20 23:05:29 2018
        opendmarc-reports: started at Tue Feb 20 23:05:29 2018
        opendmarc-reports: failed to collect domain names: Table 'opendmarc.requests' doesn't exist
        opendmarc-expire: started at Tue Feb 20 23:05:29 2018
        opendmarc-expire: connected to database
        opendmarc-expire: expiring messages older than 180 day(s)
        opendmarc-expire: no rows deleted
        Use of uninitialized value in concatenation (.) or string at /usr/sbin/opendmarc-expire line 291.
        opendmarc-expire: TRUNCATE failed: root@monserveur:/home/moi# 
        

        C'est déjà mieux que d'avoir en réponse le fichier de Man !!!



        • Partager sur Facebook
        • Partager sur Twitter
          21 février 2018 à 0:11:25

          Une tache cron doit donc être rajouter dans le fichier /etc/crontab.

          tu devrais utiliser la commande crontab pour ajouter des tâches à une crontab.

          aucun de mes MdP ne marche

          dans la commande, su demande le mot de passe système de l'utilisateur opendmarc.

          essaye de taper la commande en tant que root...

          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            21 février 2018 à 12:00:01

            dantonq a écrit:

            dans la commande, su demande le mot de passe système de l'utilisateur opendmarc.

            C'est ce que je pensais mais ce n'est pas un utilisateur système, juste un utilisateur MySQL

            essaye de taper la commande en tant que root...

            Sur le résultat au-dessus, j'étais en mode root après avoir fait sudo su ...

            Lorsque j'avais lancer le script pour créer les tables dans la BDD, j'avais pas fait attention qu'une des tables comportait une erreur de synthaxe d'où l'erreur

            opendmarc-import: failed to retrieve table ID: Table 'opendmarc.requests' doesn't exist

            Le pire, c'est que ce script est fourni dans la doc de OpenDmarc !!

            Mais ça a l'air de fonctionner dans l'ensemble

            Merci de ton aide, je vais faire des test avant de mettre en résolu au cas ou j'ai encore besoin d'aide

            • Partager sur Facebook
            • Partager sur Twitter
              21 février 2018 à 12:34:26

              ce script est fourni dans la doc de OpenDmarc

              on peut avoir l'adresse, s'il te plaît ?

              [opendmarc] n'est pas un utilisateur système

              getent passwd opendmarc 

              -
              Edité par dantonq 21 février 2018 à 13:00:15

              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                21 février 2018 à 19:25:33

                La doc n'est pas sur internet, elle est installé dans /usr/share/doc/opendmarc/schema.mysql quand on installe opendmarc.

                Copie de la table qui pose problème :

                -- A table for logging reporting requests
                CREATE TABLE IF NOT EXISTS requests (
                	id INT NOT NULL AUTO_INCREMENT,
                	domain INT NOT NULL,
                	repuri VARCHAR(255) NOT NULL,
                        adkim TINYINT NOT NULL,
                        aspf TINYINT NOT NULL,
                        policy TINYINT NOT NULL,
                        spolicy TINYINT NOT NULL,
                        pct TINYINT NOT NULL,
                        locked TINYINT NOT NULL,
                	firstseen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                	lastsent TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
                
                	PRIMARY KEY(id),
                	KEY(lastsent),
                	UNIQUE KEY(domain)
                );

                A la ligne "lastsent", ça plante une erreur à cause la valeur de DEFAULT.

                j'ai modifié la ligne comme suit :

                lastsent DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,

                mais maintenant, quand je lance le script bash, j'ai une autre erreur

                root@monserveur:/home/moi# "/etc/opendmarc/report_script" -s /bin/bash
                opendmarc-import: started at Wed Feb 21 19:03:29 2018
                opendmarc-import: connected to database
                opendmarc-import: updating at line 20
                opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                opendmarc-import: updating at line 39
                opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                opendmarc-import: updating at line 57
                opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                opendmarc-import: terminating at Wed Feb 21 19:03:29 2018
                opendmarc-reports: started at Wed Feb 21 19:03:29 2018
                opendmarc-reports: selected 0 domain(s)
                opendmarc-reports: terminating at Wed Feb 21 19:03:29 2018
                

                et si je le relance une seconde fois, il s’exécute sans erreur mais mon fichier opendmarc.dat change de proprietaire et de groupe ( root:root ) et du coup le serveur rejette les mails qui arrivent après car :

                /var/run/opendmarc/opendmarc.dat: fopen(): Permission denied
                

                Du coup, je l'ai supprimé pour voir et il a été recréé automatiquement à l'arrivé d'un nouveau mail.

                Est ce que c'est possible de mettre

                rm ${WORK_DIR}/opendmarc.dat

                à la place de

                cat /dev/null > ${WORK_DIR}/opendmarc.dat

                ??

                C'est une galère ce truc !


                Un lien vers le tuto que j'ai suivi si ça peut aider ...

                https://www.skelleton.net/2015/03/21/how-to-eliminate-spam-and-protect-your-name-with-dmarc/#dmarc



                -
                Edité par florianboy01 21 février 2018 à 20:04:58

                • Partager sur Facebook
                • Partager sur Twitter
                  21 février 2018 à 20:47:52

                  est-ce que tu as essayé la commande su -c ... opendmarc en tant que root ?
                  car opendmarc est un utilisateur système, mais n'a pas de mot de passe (root permet de s'en passer en utilisant su), et a nologin en tant que shell de connexion.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                    21 février 2018 à 21:37:23

                    ça donne rien

                    root@monserveur:/home/moi# su -c "/etc/opendmarc/report-script" -s /bin/bash opendmarc
                    bash: /etc/opendmarc/report-script: Aucun fichier ou dossier de ce type
                    

                    et j'ai fais ça aussi

                    moi@monserveur:~$ sudo -c "/etc/opendmarc/report-script" -s /bin/bash opendmarc
                    usage: sudo -h | -K | -k | -V
                    usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
                    usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
                    usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-u user] [VAR=value] [-i|-s] [<command>]
                    usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-u user] file ...
                    




                    -
                    Edité par florianboy01 21 février 2018 à 21:41:40

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 février 2018 à 1:40:18

                      /etc/opendmarc/report-script
                      ce n'est pas
                      /etc/opendmarc/report_script


                      • Partager sur Facebook
                      • Partager sur Twitter

                      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                        22 février 2018 à 2:40:51

                        Oupss ! En effet, belle faute de frappe qui change beaucoup ...

                        Bon, j'ai laissé le script s’exécuter à l'heure prévu dans crontab mais j'ai juste eu droit à recevoir un mail d'erreur de root.

                        opendmarc-import: started at Thu Feb 22 02:31:02 2018
                        opendmarc-import: connected to database
                        opendmarc-import: updating at line 20
                        opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                        opendmarc-import: updating at line 39
                        opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                        opendmarc-import: updating at line 58
                        opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                        opendmarc-import: updating at line 77
                        opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                        opendmarc-import: updating at line 96
                        opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                        opendmarc-import: updating at line 114
                        opendmarc-import: failed to create table ID: Field 'adkim' doesn't have a default value
                        opendmarc-import: terminating at Thu Feb 22 02:31:02 2018
                        opendmarc-reports: started at Thu Feb 22 02:31:02 2018
                        opendmarc-reports: selected 0 domain(s)
                        opendmarc-reports: terminating at Thu Feb 22 02:31:02 2018
                        opendmarc-expire: started at Thu Feb 22 02:31:02 2018
                        opendmarc-expire: connected to database
                        opendmarc-expire: expiring messages older than 180 day(s)
                        Use of uninitialized value in concatenation (.) or string at /usr/sbin/opendmarc-expire line 291.
                        opendmarc-expire: TRUNCATE failed: opendmarc-expire: no rows deleted
                        

                        mise à jour 18 heure après

                        J'ai mis des valeurs par défaut sur pratiquement chaque colonne, des 0 pour les "int" et des xxx pour les "varchar".

                        J'ai effacé les deux dernières lignes du script report_script, refais un opendmarc.dat avec des valeurs valide provenant d'un précédent enregistrement, supprimé toutes valeur dans la BDD, modifié l'heure du crontab et après éxécution, j'ai regardé. Toutes les tables étaient remplies, seul 5 colonnes n'ont pas été modifié et ont la valeur par défaut sur 39 colonnes au total.

                        Le rapport cron qui m'a été envoyé par mon serveur est plus positif maintenant :

                        opendmarc-import: started at Thu Feb 22 20:04:01 2018
                        opendmarc-import: connected to database
                        opendmarc-import: updating at line 20
                        opendmarc-import: updating at line 39
                        opendmarc-import: updating at line 57
                        opendmarc-import: terminating at Thu Feb 22 20:04:01 2018

                        Si ça accorde, le problème ne venait pas du script report_script mais uniquement de la BDD, mais je doute pouvoir tester ce soir, beaucoup de copains et copines arrivent pour boire l'apéro, donc après, c'est mort pour moi !!! lol

                        Mais je suis content, ça avance enfin ...

                        Merci Dantonq de m'avoir soutenu et de ton aide dans mon projet. Sans ce soutient, je pense que j'aurais abandonné ...

                        -
                        Edité par florianboy01 22 février 2018 à 20:47:39

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Petit problème de script bash

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown