Interaction avec une machine distante (ssh, scp, rsync, sshfs, screen, byobu)
Vous allez très certainement être confrontés à interagir avec des machines à distance, parfois même des serveurs qui ne disposent pas de clavier/souris. Les commandes présentées dans ce chapitre vous montrent comment :
- vous connecter à distance à une machine voir, exécuter des commandes à
distance (
ssh
) - transférer des fichiers vers ou depuis une machine distante (
scp
,rsync
) - "monter" un volume distant pour y accéder localement (
sshfs
)
Se connecter à une machine distante (ssh)
Quand on a besoin de se connecter à une machine distante, si celle-ci est
équipée d'un serveur ssh, on peut utiliser la commande ssh
en ligne de
commande :
et votre terminal se retrouve connecté au serveur dont l'adresse IP est
ip_de_la_machine
. Si jamais le serveur ssh de la machine distante n'écoute pas
sur le port standard \(22\), on peut l'indiquer par l'option -p port
.
Il est plutôt confortable de se définir des alias ssh. Ils sont définis dans le
fichier ~/.ssh/config
.
Par exemple, si vous mettez le contenu ci-dessous :
Il vous permet de lancer la commande ssh raspi
qui correspond à ssh
monlogin@82.99.234.239 -p 2222
.
De temps en temps, on a besoin de passer par une machine rebond (e.g. firewall) avant
d'arriver sur la machine cible. On peut facilement le définir en ligne de
commande bien sûr mais c'est plus confortable de le définir dans son
~/.ssh/config
. Par exemple si on veut atteindre host1
en rebondissant sur la
machine proxy1.domain.com
Host host1
Hostname host1
User monlogin_sur_host1
ProxyCommand ssh proxy1 -W %h:%p
Host proxy1
Hostname proxy1.domain.com
User monlogin_sur_proxy1
et vous pourrez alors simplement lancer la commande ssh host1
depuis votre
machine locale !
Exécuter des commandes à distance (ssh)
Avec la commande ssh
vous pouvez vous connecter sur un hôte distant, mais vous
pouvez aussi directement exécuter une commande sur cet hôte. Par exemple :
Transférer des fichiers ou depuis une machine distante (scp, rsync)
Si vous voulez copier des fichiers/répertoires de votre machine locale à une
machine distante l'inverse, il existe plusieurs commandes comme scp
ou
rsync
. La commande rsync
ne va copier que ce qui est nécessaire, en
comparant l'arborescence locale et distante lors de la copie d'un répertoire.
Par exemple, quelques appels :
Copier un fichier local sur une machine distante
$ scp /chemin/vers/rep/local/fichier monlogin@monhote:/chemin/vers/rep/
$ rsync -ah --info=progress2 /chemin/vers/rep/fichier monlogin@monhote:/chemin/vers/rep/
Copier un répertoire local sur une machine distante
$ scp -r /chemin/vers/rep/local monlogin@monhote:/chemin/vers/rep/
$ rsync -ah --info=progress2 /chemin/vers/rep/local/ monlogin@monhote:/chemin/vers/rep/dist
Voir aussi How to copy and transfer files remotely on Linux using scp and rsync
Monter un volume distant (mount, sshfs)
Si vous voulez interagir avec un répertoire sur une machine distant, il est possible de le "monter" localement et de voir ce répertoire comme si c'était un espace disque sur votre machine locale.
De manière générale, il existe plusieurs manières de monter des volumes, qui
dépendent des protocoles d'échange avec le serveur qui contient les données. La
commande mount
par exemple, gère les protocoles nfs, cifs, etc.
$ mkdir /point/de/montage/local
$ mount --types filesystem_type monlogin@monhote:/chemin/distant /point/de/montage/local
Si le serveur distant est équipé d'un serveur ssh, vous pouvez également
utiliser un montage par ssh avec la commande sshfs
:
Voir aussi How To Mount a Remote Directory With SSHFS on a Linux
Authentification alternative au mot de passe, par clé ssh (ssh-keygen, ssh-copy-id)
Il existe plusieurs mécanismes grâce auxquels un hôte distant peut vous identifier :
- par mot de passe que seul vous et l'hôte distant connaissent
- par clé ssh, chiffrement dit à clé symétrique dans lequel vous et l'hôte possédaient chacun un bout de clé
Et certainement d'autres. Maintenant, également complété par des mécanismes de 2FA (two-factor authentication) par lequel un utilisateur doit apporter une preuve complémentaire de son identité par un code partagé par exemple.
En ce qui concerne l'authentification par clé ssh, le principe est de générer une paire de clé, dites "clé publique", "clé privée". Ces clés sont symétriques et, en théorie, interchangeables. On les appelle "public", "privé" et elles possèdent des extensions et contenus différents pour éviter que l'utilisateur ne partage par erreur parfois la clé publique, parfois la clé privée ; Si quelqu'un possède les deux morceaux de la clé (plus éventuellement un mot de passe), il peut se faire passer pour vous.
Pour générer une paire de clé :
Plusieurs options peuvent être changées comme le type de clé, la longueur de la
clé, etc. Cette commande va produire \(2\) fichiers, l'un pour la clé publique,
l'autre pour la clé privée. Pour une clé de type RSA, ces fichiers seront
~/.ssh/id_rsa
pour la clé privée et ~/.ssh/id_rsa.pub
pour la clé publique.
La clé privée doit rester ... privée. La clé publique peut être partagée sans souci avec tous les serveurs sur lesquels vous avez besoin de vous authentifier : serveur ssh distant, instances gitlab, github.com, etc.
Pour copier une clé sur un serveur distant, il existe la commande ssh-copy-id
Vous pouvez alors lancer la commande ssh
qui devrait utiliser votre clé ssh
pour vous authentifier :
Lors de l'utilisation de votre clé SSH, un "agent ssh", un programme qui tourne en local sur votre machine, va déverrouiller votre clé en vous demandant son mot de passe avant de l'utiliser ; Pour les connexions ultérieures, cet agent ssh se souviendra des identités déverrouillées.
En pratique, la commande ssh-copy-id
va simplement copier le contenu de votre clé
publique dans le fichier ~/.ssh/authorized_keys
du serveur. N'hésitez pas à
aller inspecter le contenu de ce fichier pour voir les clés qui y sont déjà
renseignées :
Si vous utilisez des clés ssh pour vous connecter sur des machines distantes,
éventuellement en utilisant des rebonds, il peut être pratique de partager
"l'agent ssh". On peut alors l'indiquer dans son fichier ~/.ssh/config
avec
l'option ForwardAgent
:
Voir aussi How To Set up SSH Keys on a Linux / Unix System
Multiplexeur de terminal (screen, tmux, byobu)
Un multiplexeur de terminal vous permet de :
- virtuellement disposer de plusieurs fenêtres de terminal dans une même fenêtre. Cela s'avère extrêmement pratique en particulier lorsque vous interagissez avec une machine à distance,
- laisser un processus vivant, même si on est déconnecté d'une machine distante.
Il existe plusieurs programmes pour ça, comme screen
, tmux
ou encore
byobu
.
La commande screen
est utile lorsque vous vous connectez par ssh sur une
machine distante et que vous souhaitez conserver une session active même après
vous être déconnecté de l'hôte.
$ ssh monlogin@monhote
# Créer une nouvelle session
$ screen
# Lancer des commandes
....
# Se détacher de la session
<Ctrl+A> <d>
La séquence de touches
# Lister les sessions actives pour identifier
# le nom de la session à laquelle se réattacher
$ screen -ls
# Se réattacher à une session
$ screen -r <nom-de-session>
Une autre commande très utile est byobu
. Vous pouvez détacher/ré-attacher des
sessions comme pour screen. Comme pour screen, vous pouvez créer plusieurs
fenêtres, mais l'interface est peut-être un peu plus ergonome. Vous créez et
naviguez parmi les onglets avec les touches