sshfs
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 22.04 Jammy Jellyfish
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
sshfs 🇬🇧 ist ein FUSE-Modul, mit dem man entfernte Rechner über SSH in das eigene Dateisystem einbinden kann. Der Vorteil gegenüber einer ssh-Shell ist, dass man damit die Dateien und Verzeichnisse auf dem entfernten Rechner sehr komfortabel editieren, kopieren oder verschieben kann – genau wie die Dateien und Verzeichnisse auf den lokalen Festplatten. Dies erfordert auf dem Server ein sftp-Programm. Das ist bei den meisten SSH-Servern, wie OpenSSH, standardmäßig dabei, aber auf einigen embedded Geräten, wie OpenWRT, sind dafür spezielle Programm-Pakete notwendig.
Hinweis:
Der einzige aktive Entwickler hat das Projekt am 26.05.2022 verlassen und die zugehörige Github-Seite gesperrt. Fehler und damit auch Sicherheitslücken werden nicht mehr beseitigt, dies sollte man bedenken falls sensible Daten per sshfs transportiert werden sollen. Siehe Ankündigung. 🇬🇧
Installation¶
Folgendes Paket muss installiert [1] werden:
sshfs (universe [2])
Befehl zum Installieren der Pakete:
sudo apt-get install sshfs
Oder mit apturl installieren, Link: apt://sshfs
Benutzung¶
Vor dem Ausführen von sshfs muss FUSE eingerichtet sein [6] und ein Verzeichnis erstellt werden, in welches der entfernte Rechner eingehängt werden soll. Außerdem muss der Benutzer, unter dem sshfs
verwendet werden soll, als Mitglied der Gruppe fuse
eingetragen werden. Im folgenden wird von ~/fusessh als Verzeichnis für den entfernten Rechner ausgegangen.
Das Einhängen erfolgt im Terminal [3] über folgenden Befehl, vorher sollte aber noch ein Ordner namens fusessh erstellt werden:
mkdir ~/fusessh
sshfs Benutzername@irgendEinRechner:/pfad_auf_dem_server/ ~/fusessh
Falls ein Passwort für die Verbindung erforderlich ist, erscheint in der Konsole eine Abfrage. Das Aushängen erfolgt analog zu den anderen FUSE-Modulen mit:
fusermount -u ~/fusessh
Hinweis:
sshfs unterstützt Hardlinks nur ab OpenSSH-Server-Version 5.7 oder neuer. Bei älteren OpenSSH-Versionen ist es daher nicht möglich, sshfs für eine Datensicherung zu nutzen. Die OpenSSH-Version kann ermittelt werden indem man sich per ssh auf dem Server anmeldet und /usr/sbin/sshd -V eingibt.
Optionen¶
sshfs bietet eine Reihe von Optionen, wie z.B. -p 222
, falls der SSH-Server auf Port 222 lauschen sollte.
User Mapping¶
Mit den Optionen -o idmap=user -o uid=USERID -o gid=GROUPID
kann man "User Mapping" aktivieren. Dies ist hilfreich, falls die auf dem Server gespeicherten Dateien einen Eigentümer haben, der auf dem Client nicht vorhanden ist. Dabei werden die entfernten Rechte auf die im Kommando angegebenen Werte übertragen. Beispiel:
sshfs Benutzername@irgendEinRechner:/pfad_auf_dem_server/ ~/fusessh -o idmap=user -o uid=$(id -u) -o gid=$(id -g)
Der Befehl würde dem aktuellen Benutzer Eigentümer- und Gruppenrechte geben, gleich wie diese auf dem entfernten System gesetzt sind.
Symlinks mit einbeziehen¶
Möchte man im eigenen System auch den Symbolische Verknüpfungen (auch „Symlinks“ oder „Softlinks“ genannt), die auf dem entfernten Rechner gesetzt sind, folgen können, so gibt es hierfür die Option follow_symlinks
, die folgendermaßen genutzt werden kann:
sshfs Benutzername@irgendEinRechner:/pfad_auf_dem_server/ ~/fusessh -o follow_symlinks
Eine genaue Übersicht der Parameter kann man in der Manualseite von sshfs nachlesen. Weitere Details finden sich ebenfalls unter Benutzer und Gruppen, so wie Rechte hier im Wiki.
Automount¶
Falls man das Dateisystem automatisch beim Systemstart oder bei der Anmeldung einbinden lassen will, muss man die SSH-Authentifizierung über Public-Keys einrichten. Man ist nun nicht mehr gezwungen, das Server-Passwort einzutippen. Wichtig für das Einbinden ("mount") während des Systemstarts ist, dass sich die privaten Schlüssel ("private keys") im Root-Verzeichnis /root/.ssh/ befinden oder explizit über den Parameter -o IdentityFile=/Pfad/zum/publickkey/Schlüsseldateiname angegeben werden.
Die Datei known_hosts muss sich in beiden Fällen im Root-Verzeichnis befinden.
sudo cp /home/[NUTZERNAME]/.ssh/known_hosts /root/.ssh/
Beim Systemstart¶
über die /etc/fstab¶
In der Datei /etc/fstab muss mit Root-Rechten [7] in einem Editor [4] eine Zeile hinzugefügt werden:
sshfs#Benutzername@irgendEinRechner:/pfad_auf_dem_server/ ~/fusessh fuse uid=1003,gid=100,umask=0,allow_other,_netdev,IdentityFile=/Pfad/zum/publickkey/Schlüsseldateiname 0 0
Der Parameter _netdev
ist wichtig, da das System sonst beim Booten nicht weiß, dass eine funktionierende Netzwerkverbindung zum Einbinden der Partition erforderlich ist. Die Angabe von IdentityFile
ist nur notwendig, wenn sich der Schlüssel nicht im Root-Verzeichnis befindet.
Wird eine Verbindung für mehrere Nutzer in Verbindung mit der PublicKey-Authentifzierung genutzt, darf kein Nutzername in der /etc/fstab eingetragen werden. Der Eintrag muss also
irgendEinRechner:/pfad_auf_dem_server/ ~/fusessh fuse users,allow_other,_netdev 0 0
lauten. Hintergrund ist, dass die zugehörigen PublicKeys auf dem Server im jeweiligen Benutzerverzeichnis in der Datei ~/.ssh/authorized_keys liegen. Wird in der /etc/fstab des Clients ein Benutzername angegeben, wird bei allen anderen Nutzern die falsche authorized_keys adressiert. In diesem Fall erhält man die Fehlermeldung "Connection reset by peer".
Alle Nutzer müssen Schreibrechte auf den lokalen Mount-Ordner ~/fusessh besitzen.
Der Parameter "users" (nicht "user") ist außerdem wichtig, damit alle Nutzer berechtigt sind den Mount einzuhängen.
per Dispatcher¶
Man legt mit Root-Rechten [7] in einem Editor [4] eine Datei im Ordner /etc/NetworkManager/dispatcher.d/ an. Der Dateiname sollte mit einer Zahl beginnen, die die Startreihenfolge festlegt, wie beispielsweise 02sshfs. Nach der Erstellung des Skriptes muss dieses ausführbar gemacht werden[8].
Ein Beispielskript sieht z.B. so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/bin/bash IFACE=$1 #wird vom NetworkManager übergeben BEFEHL=$2 #wird vom NetworkManager übergeben #SSHFS-Einstellungen PORT=22 #ssh-Port des Zielsystems PFAD="/Pfad/Zielordner" # ABSOLUTE PFADANGABE im lokalen System KEY="/home/user/.mykeys/my_rsakey" #eigener privater Schlüssel case "$BEFEHL" in up) #SSHFS-Verbindung herstellen #ACHTUNG: die Optionen sind Beispiele und haben keinen Anspruch auf allgemeine Gültigkeit! /usr/bin/sshfs -p$PORT user@server:relativer_pfad_auf_dem_server/ $PFAD -o uid=1000,gid=1000,nomap=ignore,allow_other,IdentityFile=$KEY ;; down) /bin/fusermount -u $PFAD ;; *) echo $"usage: $0 {up|down}" exit 1 esac |
Weiterführende Informationen zu Dispatcher-Skripten gibt es unter NetworkManager/Dispatcher.
Hinweis:
Es besteht die Möglichkeit, ein sshfs-mount ebenfalls über die /etc/network/interfaces einzubinden, bei Verwendung des Network Managers (NM) sollte von einer Bearbeitung der /etc/network/interfaces aber abgesehen werden!
Nach der Anmeldung eines Anwenders¶
Den sshfs-Befehl
sshfs Benutzername@irgendEinRechner:/pfad_auf_dem_server/ ~/fusessh
muss man dazu bei jeder Anmeldung automatisch ausführen lassen [5].
sshfs hängt sich auf - timeout¶
Achtung!
Es kann vorkommen, dass sich die Verbindung mit sshfs nach einer Weile aufhängt und nicht mehr reagiert, obwohl das Einbinden geklappt hatte und man auch auf die Dateien und Ordner auf dem anderen Rechner zugreifen konnte.
Laut FUSEWiki 🇬🇧 gibt es dafür zwei Lösungsansätze:
1) In der Datei .ssh/config folgende Zeile hinzufügen (liegt im Homeverzeichnis des Anwenders, bzw. wenn man Automount beim Systemstart macht, ist die Datei /root/.ssh/config zu ändern):
ServerAliveInterval 15
Falls die Datei config nicht existiert, wird sie neu angelegt.
2) Oder man fügt beim oben stehenden sshfs-Befehl die Option -o ServerAliveInterval=15
ein. Dieser Lösungsansatz wurde zwar nicht laut FUSEWiki 🇬🇧 getestet, aber sollte theoretisch auch funktionieren.
sshfs -o ServerAliveInterval=15 Benutzername@irgendEinRechner:/pfad_auf_dem_server/ ~/fusessh
Diese sollte die ssh-Verbindung aufrechterhalten, auch wenn über einen längeren Zeitraum keine Aktivitäten stattfinden.
Links¶