Pair / Mob programming à distance avec tmux et ssh
Tags: pairprogramming, remote, tmux, shell
Published: 2020-10-12 11:01:47

Quand on veut faire du pair programming à distance en n’utilisant que le terminal, on peut utiliser tmux et ssh (les invités n’ont besoin que d’un client ssh), avec un google meet pour la voix uniquement.

Fonctionnalités : dans tmux, on peut ouvrir plusieurs fenêtres (un vim et un shell par exemple) qui sont toutes partagées. Tous les participants peuvent soit observer, soit prendre la main (le clavier a un léger lag pour les personnes à distance, à voir sur la durée si c’est ok -- voir Mosh dans les références si c'est un problème).

Avantage : ce setup est très léger et facile à utiliser quand on n’a pas besoin de montrer son navigateur aux autres. Fini les écrans flous et les ordinateurs qui rament à cause du partage d'écran.

Avertissement : si vous ne connaissez pas bien ssh, tmux, votre shell et un bon éditeur en ligne de commande comme Vim ou Emacs, il vaut mieux se familiariser avec ces outils avant de proposer des sessions à distance à vos collègues.

En passant, je pense qu'apprendre ces outils est un très bon investissement. Ce sont des outils puissant, répandus et stables dont vous aurez l'usage pendant des dizaines d'années. (Voir les références en fin d'article pour des recommandations sur comment apprendre Vim et tmux.)

Note : il y a un easy mode, tmate semble très bien et plus simple : [https://tmate.io/](https://tmate.io/). Si vous êtes déjà à l’aise avec tmux et la configuration de ssh, le mode d’emploi ci-dessous ne devrait pas être tellement plus compliqué.

### Prérequis

Les invités n’ont besoin que d’un client ssh.

Pour l’hôte de la session, avoir un ngrok ou équivalent, et un tmux opérationnel (brew install tmux ?) et apprendre un peu à l’utiliser (il y a un crash course en bas).

### Ajout des clés publiques des invités

La première fois uniquement, l'hôte ajoute les clés publiques des invités dans ~/.ssh/authorized_keys, sur ce modèle :

```
command="/usr/local/bin/tmux attach -t shared" ssh-rsa AABBCC...123== michel
```

Note : la commande peut varier en fonction de votre installation de tmux et de si votre shell peut le trouver sans être un login shell.

Note : j'ai eu besoin plusieurs fois de vérifier les clés publiques des invités, voir dans la section Caveats pour un exemple.

### Lancer la session

L'hôte lance ngrok (qui va indiquer un numéro de port et une url en réponse) :

```
$ ngrok tcp 22
...
Forwarding                    tcp://0.tcp.ngrok.io:12345 -> localhost:22
...
```

L'hôte lance une session tmux nommée "shared" (ça doit être le même nom que dans la commande ssh spécifiée pour les invités dans le fichier authorized_keys) :

```
$ tmux new -s shared
```

### Partager la commande pour se connecter

Les invités peuvent maintenant se connecter à votre session tmux par ssh en lançant cette commande que vous pouvez leur partager. Dans la ligne ci-dessous, remplacer le nom d’utilisateur par votre nom d’utilisateur Linux, et remplacer le port et le hostname par ce que donne ngrok (ne pas mettre "tcp://" devant le hostname) :

```
$ ssh -p 12345 user@0.tcp.ngrok.io
```

### Utiliser tmux pendant la session

Sur macOS, utiliser Cmd + et Cmd - (iTerm2) pour avoir une taille de fonte qui donne une taille d'écran confortable pour tout le monde. Pro tip : ce sont les invités qui adaptent leur taille de police pour correspondre à celle de l'hôte, afin d'avoir une référence commune.

tmux crash course (utiliser le préfix avant la touche, Ctrl-b par défaut) :

- ? pour lister les raccourcis
- % pour ouvrir un pane à droite
- " pour ouvrir un pane en dessous
- z pour zoomer et revenir
- x pour fermer un pane
- [ pour passer en scroll mode (q pour quitter)
- q pour numéroter les panes
- M-Right agrandir de 5 vers la droite (fonctionne avec Up Down et Left)
- :resize-pane -R 20 # pour étendre le pane de 20 caractère à droite (marche avec U D L R)
- { et } pour échanger les panes
- c pour créer une fenêtre
- & pour fermer une fenêtre
- w pour lister les fenêtre
- option + double click pour sélectionner par mots

### Caveats

Les utilisateurs voient leur police de caractères et leurs couleurs de terminal.

Quand un observateur clique sur sa fenêtre, ça peut modifier le pane qui a le focus pour l'hôte.

Sur macOS on a observé que cat ~/.ssh/id_rsa.pub | pbcopy peut manger la fin de la clé publique, penser à la vérifier. Pour vérifier une clé publique, on peut faire dans bash :

```bash
$ ssh-keygen -l -f <(echo ssh-rsa AAAAM...F6VRP5== bob@bob.com)
```

dans fish :

```bash
$ ssh-keygen -l -f (echo ssh-rsa AAAAM...F6VRP5== bob@bob.com | psub)
```

### Voir aussi

- Pour apprendre Vim :
    - https://vim.fandom.com/wiki/Tutorial
    - [Practical Vim](https://pragprog.com/titles/dnvim2/practical-vim-second-edition/)
- Pour apprendre tmux : [tmux 2](https://pragprog.com/titles/bhtmux2/tmux-2/)
- [https://www.hamvocke.com/blog/remote-pair-programming-with-tmux/](https://www.hamvocke.com/blog/remote-pair-programming-with-tmux/)
- [https://mosh.org/](https://mosh.org/)
- [https://tmate.io/](https://tmate.io/)