Connexion à distance via le terminal sur macOS - Partie 2
Lors d'un précédent article, nous avions vu les bases de la connexion à distance via le terminal en utilisant la commande SSH. Avec ce nouvel article, nous allons voir comment aller un peu plus loin dans l'utilisation de ssh.
Lancer une unique commande
Si vous devez vous connecter à une machine distante pour y exécuter une unique commande, il est possible de l'ajouter directement derrière la commande ssh afin d'obtenir le résultat immédiatement.
Par exemple, pour savoir depuis quand le Mac est lancé
ssh sky@MacPro.local uptime
j'indique le mot de passe de mon compte, et j'obtiens directement le resultat
16:13 up 25 days, 7:46, 11 users, load averages: 3.88 3.76 3.66
Après le résultat, je suis de retour sur mon appareil, je ne suis pas connecté au Mac distant.
Lancer des commandes persistantes
En ouvrant une session sur une machine distante, vous ouvrez un espace de travail sur cette machine. En fermant la session, ou si vous êtes déconnecté (à cause d'une coupure du réseau, par exemple), les commandes lancées seront perdues.
Pour que les commandes continuent à fonctionner après avoir fermer la session, il faut les mettre en fond de tâche, soit avec un & en fin de commande, soit avec ctrl+z pour mettre la commande en pause, puis bg pour la mettre en fond de tâche (background).
Pour l'exemple, nous allons lancer un ping infini dont l'affichage ira dans le néant. Cette commande ne se terminera pas tant que je ne l'aurai pas décidé.
Je me connecte donc à la machine distante, je lance ma commande, et enfin, je ferme la session.
ssh sky@MacPro.local
ping localhost > /dev/null &
exit
Lorsque j'ai lancé le ping, la machine m'a renvoyé les données
[1] 80693
Cela indique que la commande dispose du PID 80693 et que si je veux la récupérer, il faut que j'indique l'identifiant 1.
Maintenant, reconnectons nous pour vérifier. Si votre machine distante est aussi votre machine locale, vous pouvez vérifier directement, cela sera plus rapide. Je cherche donc le processus "ping"
ps -acx | grep "ping"
et j'obtiens comme réponse
80693 ?? 0:00.01 ping
Je retrouve bien le PID du processus, et le ?? m'indique que la session l'ayant créé n'existe plus.
Malheureusement, sans ré-assigner le processus, je ne peux plus le rattraper, et ma seule solution est de le tuer, en indiquant son PID, pour l'arrêter.
kill -1 80693
Si un processus sans fin peut poser soucis, comme ici, cette solution peut cependant être très pratique pour lancer une tâche s'arrêtant toute seule dès qu'elle est terminée, comme un backup, ou un encodage.
Ouvrir une session persistante
Pour aller encore plus loin, il est possible d'ouvrir une session à travers la connexion SSH. Cette session a l'avantage d'être persistante. Ainsi, même si la connexion se coupe, ou est quittée, il est possible de retrouver son espace de travail, tel qu'on l'avait laissé.
Les deux logiciels les plus connus, mais surtout disponibles sur macOS, sont screen et tmux. Screen est installé avec macOS, mais comme d'habitude avec Apple, il ne s'agit pas d'une version récente puisqu'elle date de 2006.
screen -v
Screen version 4.00.03 (FAU) 23-Oct-06
Heureusement, une version plus à jour est disponible sur Homebrew
brew info screen
screen: stable 4.6.2 (bottled), HEAD
tmux n'est pas installé avec macOS, il faut passer par Homebrew ou un autre installeur de paquets pour l'obtenir.
brew info tmux
tmux: stable 2.9a (bottled), HEAD
Je ne pourrai sincèrement pas vous dire lequel est le plus performant, car je n'utilise que screen, et encore pour une utilisation ultra-légère. Pour la suite de l'article, je ne parlerai donc que de screen.
Créons notre première session, en lui donnant un nom.
screen -S maSession
Vous voici devant un nouveau terminal tout neuf, prêt à être utilisé. Pour l'exemple, affichons le chemin, qui devrait être la racine de votre dossier utilisateur sur la machine sur laquelle vous êtes connectés
pwd
puis, listons en les éléments
ls -l
Maintenant sortons de notre console virtuelle, sans la quitter. Pour cela, il faut utiliser le raccourci clavier ctrl+a puis d.
Même si la session est détachée, les logiciels en cours continuent de fonctionner en fond de tâche, et c'est bien l'intérêt d'une telle application.
Vous revenez à votre connexion initiale. Quittez votre session SSH et relancez là. De nouveau connecté, nous allons récupérer notre session. Mais avant, comme il est possible de créer plusieurs sessions qui tourneraient en parallèle, il peut être pratique de regarder la liste des sessions ouvertes
screen -ls
J'obtiens le résultat
There is a screen on:
68993.maSession (Detached)
1 Socket in /tmp/uscreens/S-sky.
Pour récupérer la session que je souhaite
screen -r maSession
J'aurai pu aussi exécuter la commande
screen -r
puis choisir la session qui m'intéresse.
Dans la sessions, vous devriez voir le résultat de vos précédentes commandes, à savoir les résultat de pwd et de ls -l.
Pour quitter définitivement la session, il suffit, une fois dedans, d'utiliser la commande habituelle
exit
Il n'est alors plus possible de reprendre la session, et elle n'apparait plus dans la liste.
Pour continuer, voici une fonctionnalité que j'adore avec screen. S'il n'est pas possible de récupérer une session déjà attachée par un autre utilisateur, screen permet une connexion en mode "spectateur", ainsi il est possible de voir ce que fait l'autre utilisateur en temps réel, très pratique pour voir l'évolution d'un projet ou d'une installation de logiciel.
screen -x maSession
Comme pour la commande -r, il est possible d'indiquer le nom de la session, ou de la choisir dans la liste.
Enfin, screen dispose d'une très longue page de man, qui contient toutes les options utilisables lors de son appel en ligne de commande. La page contient aussi toutes les commandes à utiliser à l'intérieur du logiciel, et qui commencent par ctrl+a. Comme d'habitude, pour y accéder
man screen
et ctrl+c ou simplement q pour en sortir.
Ca y est ? Terminé ?
Et bien ... non, ssh est un thème extrèmement vaste. Si nous nous sommes un peu éloigné de ssh avec l'utilisation de screen, nous pourrions encore en parler pendant de nombreux articles. Et parmi tous les sujets à notre portée, il y en a un, en particulier, qui nécessite un petit article. A très vite donc ...