Scripts et Auto-modification

dimanche, 4 janvier 2015

J'ai récemment eu besoin qu'un de mes script s'ajoute des données (une variable en fait).

Voilà donc un article (court, très court même) pour vous montrer la tête que ça a :

#!/bin/bash

if [[ $secret ]]; then
    echo $secret;
else
    touch strange2
    echo "#!/bin/bash" >> strange2
    echo "secret='this is secret'" >> strange2
    tail -n +2 $0 >> strange2
    chmod +x strange2
    mv strange2 $0 && exit
fi

Regardons le code de plus près :

  1. le script vérifie si la variable $secret est définie et l'affiche si c'est le cas
  2. sinon :
    1. il crée un fichier strange2
    2. colle le she-bang dans ce fichier
    3. y écrit la définition de la variable $secret
    4. se recopie lui même (à partir de la deuxième ligne: -n +2) dans ce fichier
    5. rend son clone éxécutable (il aurait été mieux de faire en sorte de lui assigner les mêmes droits que l'original)
    6. change le nom du clone par son propre nom (contenu dans $0) et quitte

Si on teste le script ::

$ cat strange.sh
#!/bin/bash

if [[ $secret ]]; then
    echo $secret;
else
    touch strange2
    echo "#!/bin/bash" >> strange2
    echo "secret='this is secret'" >> strange2
    tail -n +2 $0 >> strange2
    chmod +x strange2
    mv strange2 $0 && exit
fi
$ ./strange.sh
$ cat strange.sh
#!/bin/bash
secret='this is secret'

if [[ $secret ]]; then
    echo $secret;
else
    touch strange2
    echo "#!/bin/bash" >> strange2
    echo "secret='this is secret'" >> strange2
    tail -n +2 $0 >> strange2
    chmod +x strange2
    mv strange2 $0 && exit
fi
$ ./strange.sh
this is secret

... on remarque qu'il s'est bien modifié et qu'au deuxième lancement, il affiche bel et bien de contenu de la variable ajoutée.

Voilà donc un truc pas forcément très très utile, mais rigolo.