ssh
. C'est un excellent outil, mais j'ai toujours trouvé une chose étrange à ce sujet. Malgré le fait que les connexions ssh permettent de transférer des fichiers à l'aide de scp
et sftp
, nous n'avons pas la possibilité de déplacer des fichiers entre les systèmes local et distant sans exécuter le programme sur l'hôte local, ou sans se connecter à la machine locale à partir de la télécommande.
Ce dernier est un réel problème, car les serveurs sont souvent connectés en étant derrière un pare-feu ou derrière un routeur NAT, c'est-à-dire sans adresse IP permanente. En conséquence, le serveur, dans tous les cas, ne pourra pas se connecter au système local à partir duquel il a été précédemment accédé. Si dans une session ssh vous pouviez simplement prendre un fichier local ou distant et le transférer là où vous le souhaitez, ce serait très pratique.
En fait, je n'ai pas tout à fait atteint cet objectif, mais j'ai été très près de l'atteindre. Dans cet article, je vais vous parler d'un script qui vous permet de monter des répertoires distants sur votre ordinateur local. Sur la machine locale, vous devrez installer
sshfs
, mais sur un emplacement distant où vous ne pourrez peut-être pas installer de programmes, vous n'aurez rien à changer. Si vous passez du temps à configurer les systèmes, et s'il existe un serveur ssh fonctionnel sur l'ordinateur client, vous pouvez également monter des répertoires locaux sur des systèmes distants. Vous n'avez pas à vous soucier du blocage des adresses IP ou des ports. En fait, si vous êtes capable de vous connecter à une machine distante, cela signifie que vous réussirez ce que je veux vous dire.
Du coup, si tout cela est combiné, il s'avère que je suis très proche du but. Je peux travailler avec un shell de commande sur le client ou sur le serveur et j'ai la possibilité de lire et d'écrire facilement des fichiers des deux côtés de la connexion. Pour ce faire, il vous suffit de tout configurer correctement.
Y a-t-il un piège ici?
Peut-être décidez-vous qu'il y a une sorte de prise. Après tout, nous parlons en fait d'utiliser deux connexions ssh. L'un est utilisé pour monter le système de fichiers et l'autre est utilisé pour se connecter à l'ordinateur. Et c'est en fait le cas. Mais si elle est correctement configurée
ssh
, l'authentification ne devra être effectuée qu'une seule fois, sans passer trop de temps à organiser deux connexions.
De plus, le travail est grandement facilité par le scénario, dont je vais parler. Il cache les détails à l'utilisateur, donc la procédure de connexion semble (presque) comme d'habitude, et après cela, tout fonctionne comme il se doit.
Quelques mots sur sshfs
L'utilitaire
sshfs
vous permet de travailler avec le système de fichiers dans l'espace utilisateur (système de fichiers dans l'espace utilisateur, FUSE). Autrement dit, nous parlons du fait qu'il existe une couche dans l'espace utilisateur qui se trouve au-dessus du système de fichiers de base. Dans ce cas, un tel système de fichiers est le serveur ssh qui prend en charge sftp
. Cela vous permet de travailler avec des fichiers situés sur un système distant, en les traitant comme s'ils se trouvaient dans un système de fichiers réel sur l'ordinateur local. Si vous ne l'avez pas encore essayé sshfs
, essayez-le. Cet utilitaire fonctionne très bien.
Supposons que vous soyez connecté à votre ordinateur
myserver
et exécutez la commande suivante à partir de votre ordinateur local:
sshfs myserver:/home/admin ~/mounts/myserver
Cela rendra le répertoire de l'ordinateur distant
/home/admin
accessible sur le système local le long du chemin ~/mounts/myserver
.
Lors de l'utilisation,
sshfs
vous pouvez utiliser diverses options. Par exemple, vous pouvez prendre des dispositions pour vous reconnecter après avoir perdu la connexion. Pour plus de détails, sshfs
consultez l'aide.
Puisqu'il
sshfs
utilise une version montée à distance du fichier, toutes les modifications apportées au fichier sont enregistrées sur la machine distante. Et une fois la connexion sshfs fermée, rien ne reste sur l'ordinateur local. Nous allons résoudre ce problème maintenant.
Préparation préliminaire
Avant de passer à la description du script, qui a été mentionnée ci-dessus, je veux parler de certains des paramètres du client que vous pouvez, si vous le souhaitez, modifier vous-même. Donc, ici, je crée un répertoire
~/remote
et je crée des sous-répertoires pour chaque ordinateur distant. Par exemple - il peut s'agir de répertoires ~/remote/fileserver
et ~/remote/lab
.
Le script est appelé
sshmount
. Il prend les mêmes arguments que ssh
. Pour simplifier le travail avec le script, les informations sur l'hôte distant doivent être stockées dans un fichier ~/.ssh/config
, ce qui permettra d'utiliser des noms d'hôte simples et courts. Par exemple, les informations informatiques lab
peuvent ressembler à ceci:
Host lab
Hostname lab.wd5gnr-dyn.net
Port 444
User alw
ForwardX11 yes
ForwardX11Trusted yes
TCPKeepAlive yes
Compression yes
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
Ce n'est pas vraiment nécessaire, mais avec cette approche, vous avez à votre disposition un joli répertoire
~/remote/lab
, pas une construction de vue complexe ~/remote/alw@lab.wd5gnr-dyn.net:444
. Il n'y a rien de mystérieux dans tous ces paramètres. La seule chose que je veux attirer votre attention sur cela ControlMaster
et ControlPath
vous permettre de vous organiser pour courir plus vite avec des composés qui, dans ce cas, sont très importants.
De plus, vous pouvez organiser une connexion automatique à un système distant à l'aide de clés ssh privées. Voici les trucs à ce sujet.
Scénario
Notre script peut être utilisé de deux manières. Ainsi, s'il est appelé via un lien vers
sshunmount
, il démontera le système de fichiers associé à l'hôte distant spécifié. S'il est appelé différemment (généralement comment sshmount
), il effectue les trois actions suivantes:
- Il vérifie si le répertoire contient un
~/remote
sous - répertoire avec le même nom que le nom d'hôte (par exemple -lab
). S'il n'y a pas de tel répertoire, il affiche un message d'erreur et continue de fonctionner. - Si un tel répertoire existe, le script examine la liste des systèmes de fichiers montés au cas où le système de fichiers requis serait déjà monté. Si tel est le cas, il continue de travailler.
- Si le répertoire n'est pas monté, il appelle
sshfs
et continue.
Ce script peut être trouvé sur GitHub . Et voici son code, dont certains commentaires ont été supprimés:
#!/bin/bash
if [ "$1" == "" ]
then
echo Usage: sshmount host [ssh_options] - Mount remote home folder on ~/remote/host and log in
echo or: sshunmount host - Remove mount from ~/remote/host
exit 1
fi
# sshunmount...
if [ $(basename "$0") == sshunmount ]
then
echo Unmounting... 1>&2
fusermount -u "$HOME/remote/$1"
exit $?
fi
# ...
if [ -d "$HOME/remote/$1" ] # ?
then
if mount | grep "$HOME/remote/$1 " # ?
then
echo Already mounted 1>&2
else
sshfs -o reconnect $1: $HOME/remote/$1 # mount
fi
else
echo No remote directory ~/remote/$1 exists 1>&2
fi
ssh $@ #
Ce script me donne la moitié de ce dont j'ai besoin. À savoir, il vous permet de travailler facilement avec des fichiers distants sur l'ordinateur local auquel je suis connecté. Mais faire en sorte qu'à partir d'un ordinateur distant, il soit possible de travailler avec des fichiers situés sur la machine locale est un peu plus difficile.
Résoudre le problème inverse
Si vous souhaitez expérimenter le montage de dossiers sur votre machine locale sur un serveur, vous aurez besoin d'un serveur ssh fonctionnant sur la machine locale. Bien sûr, si votre ordinateur local est visible et accessible par le serveur, alors c'est simple: exécutez-le simplement sur l'ordinateur distant
sshfs
et montez le dossier dessus à partir de l'ordinateur local. Mais dans de nombreux cas, nous n'avons pas accès au système local, qui peut se trouver derrière des pare-feu ou des routeurs. Cela est particulièrement vrai si le rôle d'un système local est joué par un ordinateur portable qui peut se connecter au réseau à partir de différents endroits.
Mais notre tâche, malgré toutes ces difficultés, peut encore être résolue. Il y a deux parties à sa solution.
Tout d'abord - il est nécessaire, lors de l'appel
sshmount
, spécifiez un argument supplémentaire (le fichier peut être édité dans le cas où vous devez constamment exécuter une commande similaire):
sshmount MyServer -R 5555:localhost:22
Deuxièmement, après vous être connecté à l'hôte, vous devez exécuter la commande suivante:
sshfs -p 5555 localhost:/home/me ~/local
Grâce à l'option
-R
, une prise sur le port est créée sur la machine distante 5555
(qui, bien sûr, devrait être libre) et sa connexion avec le port de la 22
machine locale est effectuée . En supposant que le serveur ssh fonctionne sur le port 22
, cela permettra au serveur de se connecter à la machine locale via la même connexion. Il n'a pas besoin de connaître notre adresse IP ou d'avoir un port ouvert.
La commande
sshfs
, qui peut être exécutée au démarrage du système, lie le répertoire local /home/me
au répertoire sur le ~/local
serveur distant. Si, en outre, vous êtes connecté localement, vous pouvez consulter les variables d'environnement qui commencent par SSH_
et en savoir plus sur la connexion SSH. Par exemple, ce sont des variables $SSH_CLIENT
et $SSH_TTY
.
Bien sûr, pour que les commandes ci-dessus fonctionnent pour vous, vous devrez changer les noms d'hôte et les répertoires, ainsi que les adresses de port, pour ceux utilisés sur vos systèmes. Mais une fois que tout est configuré, tous les fichiers dont vous avez besoin seront disponibles sur les machines locales et distantes. Au fait, je n'ai pas essayé d'organiser le montage circulaire des répertoires. Si vous essayez de faire cela, quelque chose de très étrange peut se produire.
Résultat
Je suppose que vous devez être prudent lors du montage des dossiers distants sur la machine locale et des dossiers locaux sur la machine distante en même temps. Par exemple, les utilitaires qui analysent l'ensemble du système de fichiers peuvent être confus dans de telles configurations. De plus, je suis toujours à la recherche d'une réponse à la question de savoir comment se déconnecter correctement du système de fichiers du serveur lors de la sortie de la dernière session.
Mais même maintenant, tout cela nous donne de bons outils pour organiser un travail pratique et fiable avec des fichiers logiciels
ssh
. Il convient de noter qu'une autre option pour résoudre le problème de l'utilisation de fichiers sur des systèmes distants peut être la synchronisation des dossiers et leur utilisation pour transférer des fichiers entre ordinateurs.
Qu'utilisez-vous pour travailler avec des fichiers sur des systèmes Linux distants?