Forum Linux.général bash / injection contenu / saut de ligne

Posté par . Licence CC by-sa.
Tags : aucun
-2
16
avr.
2019

Bonjour à tous,

J'ai un script qui fait pas mal de chose mais en autre récupère du contenu dans un fichier puis le réinjecte dans un autr.

Mais j'ai une erreur dès que je fichier source contient un saut de ligne.
Je dois avoir un problème de syntaxe.
Si un âme charitable pouvais me donner un coup de mains.

mentionlegale=$(<$BASEPBNMENTION$(( ( RANDOM % $countmention )  + 1 ))'.php')
find ./ -type f -exec sed -i -e "s/<!--mentionlegalecontent-->/$mentionlegale/g" {} \;
  • # soignes un peu tes demandes...

    Posté par . Évalué à 4 (+3/-1).

    Franchement, lire la doc pour intégrer correctement ton code ne t'aurais pas tué… m'enfin, bref…

    Commences par rendre tes variables lisibles, les _ pour simuler les ' ' c'est top, pour ça. Aussi, définit-toi une convention de nommage et tiens-y-toi. Si tu retouches un code d'autrui, alors la convention d'origine est celle à suivre, qu'elle te plaise ou pas.

    Pour finir, vu que ton truc me semble imbuvable, pourquoi tu ne te contentes pas de sourcer, aka inclure, le fichier que tu veux importer?

    PS: conseil, ne mélange pas l'anglais et le français dans un source, ça rend juste les choses moins lisibles pour les praticiens d'une langue, de l'autre, ou des deux.
    PPS: tu es conscient que ne pas utiliser de guillemets simples implique que tes caractères spéciaux, genre le $, seront interprétés par le shell d'origine? >, <, !, sont aussi des caractères spéciaux, en fonction du shell d'origine….

    • [^] # Re: soignes un peu tes demandes...

      Posté par . Évalué à -2 (+0/-3).

      Merci pour ce cours,
      Je reconnais que ce code est très sale

      Je l'ai retravaillé, en vu du partage.
      La convention de nommage adoptée est le CamelCase
      Sourcer, aka inclure, n'est pas ce qui est recherché. puisque le script produit un contenu statique de type html.

      MentionLegale=$(<$BasePbnMention$(( ( RANDOM % $CountMention ) + 1 ))'.php')
      find ./ -type f -exec sed -i -e "s/--MentionLegaleContent--/$MentionLegale/g" {} \;
      En revanche, je n'ai pas vu le début d'une réponse pour mon problème. A moins que ce soit le PPS?

      Auquel cas:

      find ./ -type f -exec sed -i -e 's/--MentionLegaleContent--/'$MentionLegale'/g' {} \;
      me retourne:
      sed: -e expression n°1, caractère 32: commande `s' inachevée

      • [^] # Re: soignes un peu tes demandes...

        Posté par . Évalué à 4 (+2/-0).

        c'est marrant de jouer avec sed,
        C'est bien d'avoir des variable dans sed, ça permet un code plus lisible
        par contre dans le cas où la variable contient des caractère particuliers on peut avoir des blague ;)
        il n'y aurait pas un / dans $MentionLegale?

        Auquel cas il faudrait mieux user

         find ./ -type f -exec sed -i -e 'sù--MentionLegaleContent--ù'$MentionLegale'ùg' {} \;

        ou n'importe quel autre caractère que ù, mais ce dernier n'étant utilisé que dans un seul mot en langue française, il y a peu de chance de tomber dessus par accident, et en plus il est très facilement accessible ;)

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: soignes un peu tes demandes...

          Posté par . Évalué à 1 (+0/-0).

          Merci @fearan pour ton aide.

          Je ne suis pas du tout un pro de bash donc si tu a une meilleur suggestion je prends.

          $MentionLegale peux en effet contenir un /
          Mais mon souci semble vraiment venir du saut de ligne

          J'ai néanmoins testé ta suggestion, te le remplacement n'a pas lieu, et j'ai le message:

          sed: -e expression n°1, caractère 2: delimiter character is not a single-byte character

          • [^] # Re: soignes un peu tes demandes...

            Posté par . Évalué à 2 (+0/-0). Dernière modification le 17/04/19 à 13:52.

            ah pas de bol t'est en utf-u pas en iso-8859-15 ;)

            tu peux tenter avec #, %, µ, ~ enfin n'importe quel caractère qui n'est pas dans mention légale ;)

            pour savoir si le caractère en question est (ou non) sur 1 seul octet
            tu tapes

            echo -n 'ù'  | od -h

            cela te donnera le code hexadécimal du caractère

            >echo -n ù | od -h
            0000000 00f9
            0000001

            où tu vois que le caractère ù prends un octet deuxième ligne, et a pour valeur f9
            en utf-8

            >echo -n ù | od -h
            0000000 b9c3
            0000002

            cela vaut effectivement b9c3 (2 octets )

            Il ne faut pas décorner les boeufs avant d'avoir semé le vent

          • [^] # Re: soignes un peu tes demandes...

            Posté par . Évalué à 2 (+0/-0).

            ah pas de bol t'est en utf-u pas en iso-8859-15 ;)

            tu peux tenter avec #, %, µ, ~ enfin n'importe quel caractère qui n'est pas dans mention légale ;)

            pour savoir si le caractère en question est (ou non) sur 1 seul octet
            tu tapes

            echo -n 'ù'  | od -h

            cela te donnera le code hexadécimal du caractère

            >echo -n ù | od -h
            0000000 00f9
            0000001

            où tu vois que le caractère ù prends un octet deuxième ligne, et a pour valeur f9
            en utf-8

            >echo -n ù | od -h
            0000000 b9c3
            0000002

            enfin tu peux avoirs un soucis si le fichier sources contient des sauts le lignes; il faut pour cela les remplacer lors de la première lecture

            mentionlegale=$(<$BASEPBNMENTION$(( ( RANDOM % $countmention ) + 1 ))'.php' | sed -r 's/\n/\\n/' )

            puis les remettre en place lors de la deuxième passe

             find ./ -type f -exec sed -i -e "s#<!--mentionlegalecontent-->#$mentionlegale#g;s/\\\\n/\\n/g" {} \;

            Il ne faut pas décorner les boeufs avant d'avoir semé le vent

            • [^] # Re: soignes un peu tes demandes...

              Posté par . Évalué à 1 (+0/-0).

              je te remercie,

              Mais décidemment lorsque je remplace le saut en première lecture celà me retourne un variable vide?

              MentionLegale=$(<$BasePbnMention$'1.php' | sed -r 's/\n/\\n/' )
              echo "--------->" $MentionLegale  
              MentionLegale2=$(<$BasePbnMention$'1.php')
              echo "--------->" $MentionLegale2
              exit

              lancement du scripte

              $ ./test.sh
              []
              --------->
              ---------> a es
              • [^] # Re: soignes un peu tes demandes...

                Posté par . Évalué à 2 (+0/-0). Dernière modification le 17/04/19 à 15:58.

                il vaut mieux mettre des " autour :

                MentionLegale="$(<$BasePbnMention$'1.php' | sed -r 's/\n/\\n/' )"

                Il ne faut pas décorner les boeufs avant d'avoir semé le vent

                • [^] # Re: soignes un peu tes demandes...

                  Posté par . Évalué à 1 (+0/-0).

                  :( Snif, Idem

                  • [^] # Re: soignes un peu tes demandes...

                    Posté par . Évalué à 2 (+0/-0).

                    encore un petit soucis, une erreur de ma part

                    remplacer le MentionLegale…
                    par

                    MentionLegale="$(sed -r 's/\n/\\n/' $BasePbnMention$'1.php' )"

                    en effet, on ne prends plus le contenu du fichier, mais le cat fich|sed, ou pour éviter un uuoc sed … fichier :)

                    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

                    • [^] # Re: soignes un peu tes demandes...

                      Posté par . Évalué à 1 (+0/-0).

                      Je te remercie.

                      Ca avance.
                      J'ai enfin réussit mais…
                      - Il a fallut que je passe par un fichier intermédiaire
                      - pas encore réussit à remettre les saut de ligne après

                      MentionLegale="$(sed -r 's/\n/\\n/' $BasePbnMention$'1.php' )"
                      echo $MentionLegale >"mention.tmp"
                      MentionLegale=$(<'mention.tmp')
                      
                      echo "|Mes MentionLegale"
                      echo "************************************************************************"
                      echo $MentionLegale"|"
                      find ./ -type f -exec sed -i -e "s~MentionLegaleContent~$MentionLegale~g;s/\\\\n/\\n/g" {} \;

                      Sans le fichier intermédiaire (mention.tmp) j'ai le message : sed: -e expression n°1, caractère 155: commande `s' inachevée

                      Je suppose que tout mon prèblème viens d'un problème d'encodage

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.