Montage SSHFS automatique et résilient (systemd utilisateur)
Objectif : monter automatiquement des répertoires distants dans $HOME via SSHFS, de façon à ce que :
- le point de montage soit peuplé dès que la machine distante est joignable ;
- il reste vide (sans bloquer le système) quand elle ne l’est pas ;
- le montage se rétablisse seul après une coupure réseau ;
- la connexion passe automatiquement par un rebond (proxy) hors du réseau du site.
Testé sur Ubuntu 24.04. Aucun droit root n’est nécessaire, hormis l’installation de sshfs.
1. Prérequis
sudo apt install sshfs netcat-openbsd
L’authentification doit être non interactive (clé SSH, sans saisie de mot de passe). Une clé protégée par phrase secrète convient si elle est déverrouillée par l’agent SSH de la session (cas par défaut sous GNOME).
Vérification, pour chaque machine :
ssh -o BatchMode=yes MACHINE true && echo OK
Si la commande échoue (« Permission denied »), le montage automatique ne pourra pas fonctionner.
2. Configuration SSH (~/.ssh/config)
Le nom d’hôte, l’utilisateur et le port sont définis ici, pas dans le service. Le nom d’alias (MACHINE) servira aussi à nommer le point de montage.
Host MACHINE
HostName ADRESSE_OU_NOM
Port XXXX
User UTILISATEUR_DISTANT
Option : rebond automatique hors site
Si la machine n’est joignable directement que depuis le réseau du site, ajoutez un bloc Match après le bloc Host. Il teste en une seconde si le port SSH répond ; sinon, il active le rebond.
Rebond SSH classique :
Match originalhost MACHINE !exec "nc -z -w 1 ADRESSE_INTERNE 22"
ProxyJump UTILISATEUR@PASSERELLE
Rebond par tunnel TLS (exemple avec openssl s_client) :
Match originalhost MACHINE !exec "nc -z -w 1 ADRESSE_INTERNE 22"
ProxyCommand openssl s_client -quiet -connect IP_PASSERELLE:PORT -servername NOM_SNI
ServerAliveInterval 30
TCPKeepAlive no
Remarques :
- l’indentation n’a aucun sens pour ssh :
Matchouvre toujours un nouveau bloc ; - l’adresse interne apparaît deux fois (dans
HostNameet dans le testnc) : pensez à modifier les deux en cas de changement ; - le rebond s’applique aussi aux
ssh,scpetrsyncmanuels.
Vérification (affiche la ProxyCommand uniquement hors site) :
ssh -G MACHINE | grep -iE "proxycommand|proxyjump"
3. Points de montage
Un répertoire par machine, vide, nommé par exemple _MACHINE :
mkdir -p ~/_MACHINE
4. Service systemd modèle
Créer ~/.config/systemd/user/sshfs@.service :
[Unit]
Description=Montage SSHFS de %i
[Service]
ExecStart=/usr/bin/sshfs -f %i: %h/_%i -o BatchMode=yes,ConnectTimeout=5,ServerAliveInterval=15,ServerAliveCountMax=3
ExecStopPost=-/usr/bin/fusermount -uz %h/_%i
Restart=always
RestartSec=30
[Install]
WantedBy=default.target
%i: nom de l’instance (l’alias SSH) ;%h: répertoire personnel.-f: sshfs reste au premier plan, ce qui permet à systemd de le surveiller.ServerAliveInterval=15+ServerAliveCountMax=3: après ~45 s sans réponse, la connexion est abandonnée au lieu de figer les programmes qui lisent le dossier.ExecStopPost ... fusermount -uz: nettoie un montage resté bloqué (« Transport endpoint is not connected »).Restart=always+RestartSec=30: nouvelle tentative toutes les 30 s.
5. Activation
systemctl --user daemon-reload
systemctl --user enable --now sshfs@MACHINE1 sshfs@MACHINE2
Les montages démarrent à l’ouverture de session. Pour qu’ils démarrent au boot, sans session ouverte :
loginctl enable-linger $USER
6. Vérification et suivi
ls ~/_MACHINE
systemctl --user status sshfs@MACHINE
journalctl --user -u 'sshfs@*' -n 30 --no-pager
Après toute modification du fichier de service :
systemctl --user daemon-reload
systemctl --user restart sshfs@MACHINE
7. Suppression d’une instance
systemctl --user disable --now sshfs@MACHINE
systemctl --user reset-failed sshfs@MACHINE
rmdir ~/_MACHINE