> Die vollständige Liste der Artikel steht in [llms.txt](https://docs.f3cloud.com/llms.txt). Jede Seite gibt es auch als Markdown, dazu einfach .md an die Adresse anhängen. Diese Seite als Markdown: [https://docs.f3cloud.com/de/vps/sftp-file-transfer.md](https://docs.f3cloud.com/de/vps/sftp-file-transfer.md).

# SFTP – Dateien auf den Server übertragen und einen reinen SFTP-Benutzer anlegen

So übertragen Sie Dateien per SFTP auf einen VPS. Verbindung mit dem Befehl sftp unter macOS, Linux und Windows, die wichtigsten Befehle put und get, Verbindung über FileZilla, ein eigener Benutzer nur für SFTP mit Zugriff auf einen einzigen Ordner per chroot und häufige Fehler. Getestet unter Debian 12 mit OpenSSH 9.2.

Früher oder später müssen Sie Dateien einer Website auf den Server hochladen, eine Sicherungskopie herunterladen oder eine Konfigurationsdatei in einem bequemen Editor auf Ihrem eigenen Computer bearbeiten. Dafür gibt es **SFTP**, ein Protokoll zur Dateiübertragung, das über SSH läuft. Wenn Sie sich bereits per SSH mit dem Server verbinden, ist SFTP schon vorhanden, zusätzlich installieren müssen Sie nichts. In diesem Artikel klären wir, wie SFTP funktioniert, übertragen Dateien über das Terminal und über FileZilla und legen anschließend einen eigenen Benutzer an, der nur mit den Dateien in einem Ordner arbeiten kann und sich nicht per SSH am Server anmelden darf. Alle Beispiele haben wir auf einem Testserver mit Debian 12 geprüft.

***

## Wie SFTP funktioniert

Trotz des ähnlichen Namens hat SFTP nichts mit dem alten Protokoll FTP zu tun. Es ist ein Teil von SSH. Wenn Sie sich per SFTP verbinden, öffnet der Client eine gewöhnliche SSH-Verbindung auf Port 22, durchläuft dieselbe Prüfung von Passwort oder Schlüssel und startet dann auf dem Server statt der Kommandozeile ein spezielles Programm für die Arbeit mit Dateien. In der SSH-Konfiguration auf unserem Server mit Debian 12 ist es standardmäßig mit der Zeile `Subsystem sftp /usr/lib/openssh/sftp-server` eingebunden.

Daraus ergeben sich drei praktische Eigenschaften. Erstens wird alles, was übertragen wird, genauso verschlüsselt wie eine SSH-Sitzung, deshalb gehen weder Passwort noch Dateien im Klartext durch das Netz. Zweitens müssen Sie in der Firewall keine neuen Ports öffnen und keinen separaten FTP-Server installieren. Drittens funktionieren für die Anmeldung dieselben Benutzer und Schlüssel wie für SSH.

Das hat auch eine Kehrseite. Ein gewöhnlicher Benutzer, der sich per SFTP verbinden kann, kann sich auch per SSH anmelden und alle Dateien sehen, die er lesen darf. Wenn jemand nur Dateien hochladen soll, zum Beispiel ein Entwickler Ihrer Website, legen Sie für ihn besser einen Benutzer an, der nur SFTP und nur einen Ordner hat. Das geht mit den integrierten Mitteln von SSH, wir zeigen es in Schritt 3.

***

## Was Sie brauchen

* **Einen Server** mit Debian 12 oder Ubuntu 24.04 und SSH-Zugang. Wie Sie sich verbinden, steht im Artikel über [Termius](https://docs.f3cloud.com/de/vps/termius-connection.md).
* **Das Programm `sftp`** auf Ihrem Computer. Unter macOS und Linux ist es bereits vorhanden. Unter Windows 10 und 11 gehört es zur Komponente **OpenSSH Client**. Wenn der Befehl nicht gefunden wird, fügen Sie diese Komponente in den zusätzlichen Windows-Komponenten unter **Optional Features** hinzu.

***

## Schritt 1. Verbinden Sie sich per SFTP aus dem Terminal

Öffnen Sie auf Ihrem Computer ein Terminal und verbinden Sie sich mit dem Server. Geben Sie statt `IP-des-Servers` die Adresse Ihres VPS ein.

```bash
sftp root@IP-des-Servers
```

Das Programm fragt wie bei einer gewöhnlichen SSH-Verbindung nach dem Passwort und bittet bei der ersten Verbindung darum, den Schlüssel des Servers zu bestätigen. Wenn der Server neu installiert wurde und eine Warnung über einen geänderten Schlüssel erscheint, hilft der Artikel über [REMOTE HOST IDENTIFICATION HAS CHANGED](https://docs.f3cloud.com/de/linux/remote-host-identification-changed.md). Nach der Anmeldung erscheint die Eingabeaufforderung `sftp>`.

***

## Schritt 2. Übertragen Sie Dateien

In einer SFTP-Sitzung haben Sie zwei aktuelle Verzeichnisse, eines auf dem Server und eines auf Ihrem Computer. Befehle für den Server schreiben Sie wie gewohnt, Befehle für Ihren Computer mit einem `l` am Anfang, vom englischen Wort local.

| Befehl | Was er macht |
| --- | --- |
| `pwd` und `lpwd` | Den aktuellen Ordner auf dem Server und auf dem Computer anzeigen |
| `ls` und `lls` | Liste der Dateien auf dem Server und auf dem Computer |
| `cd` und `lcd` | In einen Ordner auf dem Server und auf dem Computer wechseln |
| `put Datei` | Eine Datei vom Computer auf den Server hochladen |
| `get Datei` | Eine Datei vom Server auf den Computer herunterladen |
| `put -R Ordner` und `get -R Ordner` | Einen ganzen Ordner hochladen oder herunterladen |
| `reput Datei` und `reget Datei` | Einen unterbrochenen Upload oder Download fortsetzen |
| `mkdir`, `rm`, `rename` | Einen Ordner erstellen, eine Datei löschen, umbenennen |
| `bye` | Die Sitzung beenden |

Unten sehen Sie eine echte Sitzung von unserem Computer. Wir haben auf dem Server einen Ordner erstellt, eine Datei hineingeladen, geprüft, dass sie vorhanden ist, und sie unter einem anderen Namen wieder heruntergeladen.

```bash
mkdir site-backup
cd site-backup
put report.txt
ls -l
get report.txt report-copy.txt
bye
```

<figure><img src="https://docs.f3cloud.com/img/sftp-session.png" alt="Sftp-Sitzung, Erstellen des Ordners site-backup, Hochladen von report.txt mit dem Befehl put und Herunterladen mit dem Befehl get"><figcaption><p>Die Datei wurde auf den Server hochgeladen und wieder heruntergeladen</p></figcaption></figure>

Der Befehl `put` nimmt die Datei aus dem aktuellen Ordner auf dem Computer, und `get` speichert die Datei ebenfalls dort. Deshalb wechseln Sie vor der Arbeit am besten mit `lcd` in den gewünschten Ordner auf Ihrem Computer.

***

## So verbinden Sie sich über FileZilla

Wenn Sie Dateien lieber mit der Maus verschieben, nutzen Sie FileZilla, ein kostenloses Programm für Windows, macOS und Linux. Laut der offiziellen Anleitung von FileZilla läuft die Verbindung per SFTP so ab.

1. Geben Sie in der Schnellverbindungsleiste oben im Fenster im Adressfeld die Serveradresse mit dem Präfix `sftp://` ein, zum Beispiel `sftp://203.0.113.10`.
2. Geben Sie Benutzername und Passwort ein.
3. Den Port müssen Sie nicht angeben, für SFTP wird standardmäßig 22 verwendet.
4. Klicken Sie auf die Schaltfläche für die Schnellverbindung **Quickconnect** oder drücken Sie <kbd>Enter</kbd>.

Nach der Verbindung sehen Sie links die Dateien Ihres Computers und rechts die Dateien des Servers. Zwischen beiden übertragen Sie Dateien per Drag-and-drop.

> **Vergessen Sie das Präfix sftp:// nicht.**
>
> Ohne das Präfix verbindet sich FileZilla per gewöhnlichem FTP auf Port 21. Auf einem VPS, auf dem es keinen FTP-Server gibt, funktioniert eine solche Verbindung nicht.

***

## Schritt 3. Legen Sie einen Benutzer nur für SFTP an

Jetzt legen wir den Benutzer `sftpuser` an, der nur in einem Ordner mit Dateien arbeiten kann und sich nicht per SSH anmelden darf. Dafür kann SSH einen Benutzer mithilfe von **chroot** in einem Verzeichnis einsperren. Für einen solchen Benutzer wird der angegebene Ordner zum Stammverzeichnis des Dateisystems, und höher als dieses kann er nicht gelangen.

Für chroot gilt eine strenge Regel. Der Ordner selbst, in dem der Benutzer eingesperrt wird, und alle Ordner darüber müssen `root` gehören, und außer `root` darf niemand Schreibrechte darauf haben. Deshalb legt der Benutzer seine Dateien in einem Unterordner `files` ab, der ihm bereits gehört.

1. Erstellen Sie eine Gruppe und einen Benutzer ohne Zugang zur Kommandozeile.

   ```bash
   groupadd sftponly
   useradd -m -d /home/sftpuser -s /usr/sbin/nologin -G sftponly sftpuser
   passwd sftpuser
   ```

   Der Befehl `passwd` fragt zweimal nach dem Passwort für den neuen Benutzer. Mit diesem Passwort verbindet er sich per SFTP.

2. Erstellen Sie den Ordner für chroot und den Ordner für die Dateien mit den richtigen Besitzern.

   ```bash
   mkdir -p /srv/sftp/sftpuser/files
   chown root:root /srv/sftp /srv/sftp/sftpuser
   chmod 755 /srv/sftp /srv/sftp/sftpuser
   chown sftpuser:sftpuser /srv/sftp/sftpuser/files
   ```

3. Legen Sie eine Sicherungskopie der SSH-Einstellungen an und öffnen Sie sie.

   ```bash
   cp /etc/ssh/sshd_config /root/sshd_config.bak
   nano /etc/ssh/sshd_config
   ```

4. Fügen Sie ganz am Ende der Datei den folgenden Block ein und speichern Sie die Datei. `%u` ersetzt SSH durch den Benutzernamen, deshalb passt ein Block für alle künftigen Benutzer der Gruppe `sftponly`.

   ```bash
   Match Group sftponly
       ChrootDirectory /srv/sftp/%u
       ForceCommand internal-sftp -d /files
       AllowTcpForwarding no
       X11Forwarding no
   ```

5. Prüfen Sie die Einstellungen und übernehmen Sie sie. Wenn `sshd -t` einen Fehler ausgibt, laden Sie SSH nicht neu, sondern korrigieren Sie die Datei.

   ```bash
   sshd -t && systemctl reload ssh
   ```

> **Schließen Sie die aktuelle Verbindung nicht.**
>
> Solange Sie die SSH-Einstellungen ändern, lassen Sie das Fenster, in dem Sie arbeiten, geöffnet. Prüfen Sie zuerst in einem neuen Fenster, dass die Anmeldung am Server weiterhin funktioniert, und schließen Sie erst dann das alte. So haben wir es gemacht, und die Anmeldung für `root` funktionierte nach der Änderung weiter.

Verbinden Sie sich mit dem neuen Benutzer über den Befehl `sftp sftpuser@IP-des-Servers`. Er landet sofort im Ordner `/files`, kann dort Dateien hochladen, aber nicht höher wechseln. Im Stammverzeichnis sieht er nur den Ordner `files`, den Ordner `/etc` des Servers gibt es für ihn schlicht nicht.

<figure><img src="https://docs.f3cloud.com/img/sftp-chroot-user.png" alt="Sftp-Sitzung des Benutzers sftpuser, Ordner /files, im Stammverzeichnis ist nur files sichtbar, cd /etc funktioniert nicht"><figcaption><p>Der Benutzer ist in seinem Ordner eingesperrt</p></figcaption></figure>

Wenn derselbe Benutzer versucht, sich per SSH anzumelden, antwortet der Server mit **This service allows sftp connections only.** und beendet die Verbindung.

Um einen weiteren solchen Benutzer hinzuzufügen, wiederholen Sie die Schritte 1 und 2 mit seinem Namen. Den Block in `sshd_config` müssen Sie nicht ändern.

***

## Häufige Fragen

<details>

<summary>fatal: bad ownership or modes for chroot directory</summary>

Der chroot-Ordner oder einer der Ordner darüber gehört nicht `root` oder ist für jemand anderen beschreibbar. Der Client sieht dabei nur **Connection closed**, den eigentlichen Grund finden Sie im Protokoll mit dem Befehl `journalctl -u ssh -n 20`. Wir haben diesen Fehler erhalten, als wir den Benutzer selbst zum Besitzer von `/srv/sftp/sftpuser` gemacht hatten. Stellen Sie den Besitzer mit den Befehlen `chown root:root /srv/sftp/sftpuser` und `chmod 755 /srv/sftp/sftpuser` wieder her.

</details>

<details>

<summary>dest open "/report.txt": Permission denied</summary>

Der Benutzer versucht, eine Datei in das Stammverzeichnis seines chroot-Ordners zu schreiben, und dieses gehört `root`. Das ist so gewollt. Legen Sie Dateien im Unterordner `files` ab, dorthin gelangt der Benutzer direkt nach der Anmeldung.

</details>

<details>

<summary>This service allows sftp connections only.</summary>

Das ist kein Fehler. Ein Benutzer aus der Gruppe `sftponly` kann nur per SFTP arbeiten, die Anmeldung an der Kommandozeile per SSH ist ihm verboten.

</details>

<details>

<summary>Permission denied (publickey,password)</summary>

Der Server hat weder den Schlüssel noch das Passwort akzeptiert. Wir haben diesen Fehler erhalten, als wir uns mit dem Benutzer `sftpuser` ohne Schlüssel und ohne Passwort verbunden haben. Prüfen Sie Benutzernamen und Passwort, und wenn noch kein Passwort gesetzt ist, legen Sie es mit dem Befehl `passwd sftpuser` fest. Wenn Sie sich per Schlüssel anmelden, muss der öffentliche Schlüssel in `/home/sftpuser/.ssh/authorized_keys` liegen, also im Home-Verzeichnis und nicht im chroot-Ordner. Mehr zu Schlüsseln steht im Artikel über [SSH-Schlüssel](https://docs.f3cloud.com/de/vps/security/ssh-keys.md).

</details>

***

## Unsere Ressourcen

**Telegram-Kanal:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Hosting-Website:** [https://f3cloud.com](https://f3cloud.com/de)
