Rejouer un session de terminal avec playitagainsam


Combien de fois, durant une formation, on m’a demandé si je pouvais donner un dump de la session shell.

playitagainsam, ou PIAS, a exactement pour but de faire cela: il lance un shell, enregistre ce qu’on y a tapé, et quand on quitte le shell, sauvegarde le tout dans un fichier. Ensuite, on peut lire le contenu du fichier et revoir la session shell telle qu’elle a été tapée.

C’est un programme Python, on peut donc le pip installer :

pip install playitagainsam --user

Ensuite, on lance une session à enregistrer avec la sous commande record :

pias record nom_du_fichier_ou_sauver_l_enregistrement

PIAS va lancer un nouveau shell, par défaut le même que votre shell actuel (souvent bash, pour moi fish), mais vous pouvez préciser un type de shell spécial avec --shell. Ex :

pias record ex1 --shell ipython

A partir de là il n’y a rien à faire. On peut travailler normalement et oublier qu’on a utilisé PIAS. Une fois qu’on a terminé sa petite affaire, il suffit de sortir du shell (CTRL + D, exit, etc), et la session va être sauvegardée dans un format JSON facile à corriger à la main si vous souhaitez la rendre plus agréable :

{
  "events": [
    {
      "act": "OPEN",
      "size": [
        162,
        33
      ],
      "term": "1c53f048e3a74984b2a93af175e24e87"
    },
    {
      "act": "PAUSE",
      "duration": 0.10042214393615723
    },
    {
      "act": "WRITE",
      "data": "\u001b]0;sam@sametmax.com: /tmp\u0007sam@sametmax.com:/tmp$ ",
      "term": "1c53f048e3a74984b2a93af175e24e87"
    },
    {
      "act": "ECHO",
      "data": "touch essai",
      "term": "1c53f048e3a74984b2a93af175e24e87"
...
}

Quand vous voulez rejouer la session :

pias play fichier_d_enregistrement

Par défaut il faut appuyer sur une touche quelconque du clavier pour voir apparaitre chaque caractère, donnant l’impression que vous êtes un hacker de Hollywood. C’est rigolo, mais parfaitement chiant à la longue. On peut faire jouer la session automatiquement avec l’option --auto-type qui va taper chaque ligne automatiquement. Il suffira alors d’appuyer sur entrée à chaque ligne pour avoir le résultat suivant. C’est mon mode préféré.

Si vous êtes un gros feignant, vous pouvez tout jouer en automatique en rajoutant l’option --auto-waypoint qui va vous dispenser de taper entrée à chaque fin de ligne. Ex :

pias play ex1 --auto-type --auto-waypoint

La session jouée est simulée. Elle n’a aucun impacte sur le système. Si vous faites un mkdir dans bash ou un shutil.rmtree dans python, ça ne fera rien.

Néanmoins, parfois il est utile d’avoir le effets réels des commandes. Dans ce cas on peut utiliser --live-replay. Attention, faites bien gaffe à ce que vous allez jouer…

playitagainsam est intéressant pour tout ce qui est formation et tutorial, d’autant plus qu’il existe un player javascript pour faire la démonstration de vos sessions shell sur un blog ou un slideshow.

10 thoughts on “Rejouer un session de terminal avec playitagainsam

  • Balthazar

    Dans le même genre, si tu utilises IPython, tu peux utiliser la commande magique %save. Tu lui spécifies d’où à où tu veux aller, et il exporte ça dans un fichier .py, que tu peux ré-exécuter. Sympa :)

  • Obitw0

    Je connaissais déjà la commande script, mais là ça m’a l’air beaucoup plus puissant. Je me mets ça de côté pour mes pentests :D
    Merci pour le partage!

  • H3

    Génial ce truc ! La première idée qui me viens en tête, c’est que ça peut être pratique pour faire des mises en prod…

  • ggrdx

    Génial comme idée Sam !

    Un truc qui serait frais à implémenter, mais c’est peut-être compliqué, ce serait l’export en gif pour pouvoir illustrer rapidement le résultat d’une commande ou d’une série de commandes avec un rendu plus jolie que si c’était screenshooté.

  • H3

    @Gontran @Shagshag : Tout le monde ne sais pas coder un script shell, comme ça, out of the box…

  • Shagshag

    @H3:
    Pas d’offense, il n’y avait pas d’hypocrisie dans ma question.

    En fait un script shell est un fichier texte avec les commandes à taper dans la consoles les unes à la suite des autres.
    à l’exécution elles sont exécutées dans l’ordre.

    Exemple :

    #!/bin/bash
    echo 'Hello world!'
    mkdir 'foo'
    touch 'foo/bar'
    ls 'foo'

    La seule subtilité étant la première ligne qui indique quel shell utiliser.

    Donc si on sait utiliser pias on sait créer un script shell.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.