[gull] Truc et astuces: Ascii-art... en bash.

felix felix at f-hauri.ch
Sun Nov 10 19:08:27 CET 2013


On Wed, Nov 06, 2013 at 03:22:44AM +0100, Arnaud wrote:
> C'est un programme qui a fait ce ascii-art ?
Oui et non...

Le script à été écrit ``normalement'', avec des variables nommées etc.
puis 
  perl -MO=Xref ascii-clock.pl
m'a permi de créer un petit perl, qui à généré un sed script pour
modifier tous les noms des variables:
...
    s/analog/a/g;
    s/angle/b/g;
    s/array/c/g;
    s/clockheight/d/g;
    s/clockwidth/e/g;
    s/color/f/g;
    s/constPi/g/g;
    s/cpos/h/g;
...

pour créer un ``obfuscator.sed''

(J'étais bien content de voir ``analog'' remplacé par ``a'' car si cela a
 modifié l'attitude du script: l'option n'est plus ``-analog'', mais ``-a''
 Nota: Si cela n'avais pas été le cas, j'aurrais modifié le script à la main)

Supprimer TOUS les espaces et sauts de lignes inutiles (ou supprimables).

Au final, je me suis trouvé avec un perl (qui fonctionne toujours):
 $ wc -Ll ascii-clock-o.pl 
   2 1124 ascii-clock-o.pl
(oui, 2 lignes a cause du shebang que j'ai ajouté à la main pour vérif.)

 $ head -c 100 ascii-clock-o.pl 
 #!/usr/bin/perl -s
 use Time::HiRes qw|sleep time|;$k=11;$k=$ARGV[0]if$ARGV[0];$g=atan2(1,1)/7.5;$e=

 $ ls -l  ascii-clock-o.pl 
 -rwxr-xr-x 1 felix felix 1144 nov  4 10:40 ascii-clock-o.pl

Le ascii-art à été créé à partir d'un SVG:
  perso.f-hauri.ch/~felix/svg/mondaine.svg
que j'ai positionné à 10h10 et épaissit les traits (strike-width),
puis
  gs -sDEVICE=pnmraw -dNOPAUSE -r32 -sOutputFile=- -q "$DIR/mondaine.ps" -c quit |
  pnmscale .445 |  pnmgamma .25 |  ppmtopgm | pgmtopbm -th | pbmtoascii |
  sed '/^$/d;s/[^ ]/#/g'

Ai joué avec les valeurs ``strike-width''(svg), ``-r'' (gs), ``pnmgamma''
et ``pnmscale'' jusqu'à obtenir une largeur < 80cols et un nombre de ``#''
d'au moins 30 caractères supérieur au nombres de caractères de mon script
(afin de pouvoir modifier quelques strings, event ajouter: ``"".'' ou
 encore remplacer ``"o"'' par ``"o"x1'', pour meubler..)

  $ ./ps2shape.sh | tr -d [0-9]\\n\ |wc -c
  1175

Puis, simplement ``cat shape.txt ascii-clock-obfuscated.pl >ascii-clock-final.pl''
 ... et ``emacs''.

Je me suis finalement ``tapé à la main'' les 40 lignes du script final.

Le ``shape'' étant fait de ``#'', lorsque je pratiquais une césure susceptible
de poser problème. Je n'avais qu'à essayé le script dans sa version intermédiaire.

J'ai alors pu constater que, par exemple:

  print "Blah${variable}." peut être écrit: print "Blah$   {
       variable
     }."

si la variable contient `bla', le résultat sera `Blahbla.' sans le
moindre espace.

Dé-obfuscation:

Pour transformer ceci en quelque chose de plus lisible, voici
un petit script qui le fait:

#!/bin/bash
sedscript() {
  array=(analog angle array clockheight clockwidth color constPi cpos I
     factor halfwidth handl old prctlen ray ref string R tpos)
  sedform="    s/\([\$@]\)%s\([^a-z0-9].*\|\)$/\\\\1%s\\\\2/g;\n"
  sedform+="    s/\([\$@]\){\(['\"]\|\)%s\\\\2;\\\\?}/\\\\1{%s}/g;\n"
  for ((i=0;i<${#array[@]};i++));do
    printf -v ltr \\\\x%02x $((97+i)) && printf -v ltr "%b" $ltr
    printf "$sedform" $ltr ${array[i]} $ltr ${array[i]}
  done
}
sed -e :a -e "$(sedscript)" -e ta < <(
    perl -MO=Deparse ascii-clock.pl
) |
    perltidy

--
 Félix


More information about the gull mailing list