Dateien (SFTP)

Zweispaltig: links dieses Gerät, rechts der Host. Eine Übertragung hat immer zwei Orte, und man will beide sehen, während man sie auslöst.

Warum zwei Spalten

Ein Browser mit einer Spalte und einem „Hochladen“-Knopf zwingt zu einem Dateidialog — und der weiß nicht, wo man auf der Gegenseite gerade steht.

Als Reiter oder daneben

Dateien im Menü eines Hosts öffnet den Browser als eigenen Reiter — neben dem Terminal, nicht davor. Man wechselt zwischen beiden, ohne eines von beidem zu schließen, und eine laufende Übertragung läuft weiter, während im Terminal gearbeitet wird.

Aus einer offenen Sitzung heraus gibt es beide Wege. Dateien in diesem Ordner (neuer Tab) öffnet einen Reiter, der dort beginnt, wo die Shell gerade steht. Dateien daneben öffnen teilt stattdessen die Breite mit dem Terminal — dafür braucht es Platz; ist keiner da, steht der Eintrag nicht im Menü.

Ein Dateireiter trägt ein Ordnersymbol in der Leiste: Zwei Reiter auf denselben Host heißen sonst gleich. Sein Punkt zeigt, wie es um die Verbindung steht, und Neu verbinden im Reitermenü baut sie noch einmal auf — nicht jedoch, solange eine Übertragung läuft: Die Schlange hängt an der Sitzung und ginge mit ihr verloren.

Ziehen und Ablegen

Beide Richtungen, mit dem Dateimanager des Systems. Eine Datei aus dem Explorer auf die rechte Spalte gezogen wird hochgeladen; eine Zeile der rechten Spalte auf den Schreibtisch gezogen wird heruntergeladen. Zwischen den beiden Spalten funktioniert es ebenso.

Der Weg nach draußen ist ein Versprechen und keine Kopie: Beim Aufnehmen kennt das Ziel nur Name und Größe, den Inhalt ruft es erst nach dem Loslassen ab. Deshalb beginnt der Zug sofort, auch bei zweihundert Megabyte. Der naheliegende Weg — erst herunterladen, dann ziehen — hieße: die Maus festhalten, bis die Übertragung durch ist.

Ein Zug trägt eine Zeile. Für mehrere Dateien auf einmal bleiben die Haken und die Pfeile in der Mitte.

Ordner der Gegenseite gehen nur in die linke Spalte, nicht in den Explorer: Ein Verzeichnisbaum lässt sich nicht als eine einzelne Datei versprechen. Unter Linux endet jeder Zug an der Fenstergrenze, weil es dort keine versprochenen Dateien gibt. Auf dem Telefon gibt es kein Ziehen — dort steht immer nur eine Spalte, und damit fehlt das Ziel.

Zwei Gegenstellen nebeneinander

Die linke Spalte muss nicht dieses Gerät sein. Über das Symbol in ihrer Kopfzeile lässt sie sich auf einen zweiten SSH-Host umstellen — dann stehen zwei Server nebeneinander, und die Pfeile in der Mitte kopieren zwischen ihnen. Derselbe Weg führt zurück auf dieses Gerät.

Der Strom läuft durch den Client. Gelesen wird bei dem einen, geschrieben bei dem anderen, ohne Zwischendatei auf der Platte — aber das Byte geht zweimal über deine Leitung. Ein echter Weg von Server zu Server setzte voraus, dass der eine dem anderen etwas glaubt: weitergereichte Zugangsdaten oder ein durchgereichter Agent. Das ist die Abkürzung, die man hinterher nicht mehr los wird, und deshalb gibt es sie hier nicht.

Beide Verbindungen sind eigene Verbindungen, mit eigener Host-Key-Prüfung und eigenem Zugang. Ordner gehen mit; die Verzeichnisse werden vorher angelegt. Gezogen wird in diesem Modus nicht — eine Zeile, die von einer Gegenstelle auf die andere gezogen wird, sähe aus wie eine lokale Kopie und wäre doch eine Übertragung über zwei Leitungen. Die Pfeile sagen, was passiert.

Als anderer Benutzer arbeiten

Verbunden wird als der Benutzer des Hosts — und der darf oft genau das nicht, wofür man gekommen ist. Das Personensymbol über der rechten Spalte wechselt den Benutzer; die Liste kommt vom Host selbst (getent passwd), so wie im Terminal auch.

Wie das geht, ist wieder der Punkt, an dem man ehrlich sein muss. SFTP kennt keinen Wechsel mitten in der Sitzung: Der sftp-server läuft als der Benutzer, der ihn gestartet hat, und gestartet hat ihn der SSH-Server als den Angemeldeten. tessera startet deshalb einen zweiten — über dieselbe Verbindung, auf einem eigenen Kanal:

Was auf der Gegenseite läuft
sudo -n -u postgres /usr/lib/openssh/sftp-server

Der Pfad wird gesucht, nicht geraten: Debian, RHEL, Arch und die BSDs legen den Server jeweils woanders ab. Gestartet wird ohne Anmeldeshell (-i gibt es hier nicht) — sie schriebe ihre Begrüßung in denselben Strom, über den gleich das Protokoll läuft.

Verlangt sudo ein Passwort, fragt tessera danach — nach dem Passwort des angemeldeten Benutzers, denn danach fragt sudo. Es geht als erste Zeile durch denselben Kanal und wird nirgends gespeichert. Darf der Benutzer kein sudo, sagt der Host das, und tessera zeigt dessen Meldung im Original statt einer eigenen Vermutung.

Die vorige Ebene bleibt offen: Der Weg zurück kostet keine neue Verbindung. Über der Spalte steht dann web-01 · postgres, und das Symbol wechselt die Farbe. Wie im Terminal gilt: Das ist der Stand laut tessera — mehr als das, was es selbst gestartet hat, weiß es nicht.

Eine Übertragung nach der anderen

Vier gleichzeitige Übertragungen sind auf einer normalen Leitung nicht schneller. Aber vier Balken, die alle bei 40 Prozent stehen, sagen niemandem, wie lange es noch dauert.

Ist die Schlange leer, lesen sich beide Spalten selbst neu — einmal für den ganzen Stapel, nicht einmal je Datei. Gesetzte Haken bleiben gesetzt, solange es die Zeile noch gibt.

Abbrechen, scheitern, aufräumen

Jede Zeile hat rechts einen Knopf, und der bedeutet zweierlei: Solange etwas läuft oder wartet, bricht er ab; danach nimmt er die Zeile aus der Liste. Alle abbrechen trifft alles, was noch nicht durch ist, Aufräumen entfernt alles, was es ist.

Ein Abbruch wirkt sofort, wenn die Übertragung noch wartet, und beim nächsten Block, wenn sie läuft. Mitten im Netzverkehr abzureißen hinterließe die Teildatei; so wird sie weggeräumt.

Scheitert eine Übertragung, steht der Grund an ihrer Stelle in der Zeile — Keine Berechtigung für dump.sql, nicht ein Fehlercode. Die übrigen laufen weiter: Ein Ordner mit dreihundert Dateien, von denen eine gesperrt ist, überträgt zweihundertneunundneunzig.

Wie schnell und wie lange noch

Jede laufende Zeile nennt unter den Bytes das Tempo und die Restzeit, etwa 8,4 MB/s · noch 1:22 min. Im Kopf der Leiste steht dasselbe für den ganzen Stapel: das Tempo der laufenden Übertragung und die Zeit, bis alles durch ist.

Gemittelt wird über die letzten fünf Sekunden. Kürzer, und die Zahl zappelt bei jedem Paket; länger, und sie zeigt noch die alte Leitung an, wenn die neue längst langsamer ist.

Wo nichts zu sagen ist, steht nichts. Solange noch keine zwei Punkte zum Vergleichen da sind, gibt es kein Tempo. Fehlt bei einer Datei die Größe, gibt es keine Gesamtrestzeit — eine Datei unbekannter Größe als null Byte mitzuzählen ergäbe eine zu kurze Schätzung, und die würde trotzdem geglaubt. Aus demselben Grund verschwindet die Zeile, sobald eine Übertragung durch ist: eine Zahl aus der Vergangenheit, die aussieht wie eine aus der Gegenwart, ist schlechter als keine.

.tessera-part

Geschrieben wird immer erst in eine Datei mit der Endung .tessera-part und dann umbenannt. Ein Abbruch hinterlässt so kein halbes Dokument, das aussieht wie ein ganzes.

Beim Hochladen ist der Grund noch handfester: Sonst ersetzte ein abgebrochener Upload eine funktionierende Konfiguration durch eine halbe.

Eine Ausnahme: Wer eine Datei direkt in den Explorer zieht, lässt ihn schreiben — dort gibt es keine Teildatei, und ein Abbruch kann eine unvollständige Datei zurücklassen. Alles, was über die Warteschlange läuft — die Pfeile, die Haken, der Zug in die linke Spalte —, behält die Zusage.

Überschrieben wird nichts

Gibt es den Namen schon, wird hochgezählt — und zwar vor der Endung: aus sicherung.tar.gz wird sicherung (2).tar.gz.

Lesezeichen

Am Ende jedes Pfadfelds steht ein Lesezeichen. Ein Klick darauf merkt den offenen Ordner oder vergisst ihn wieder; darunter stehen die gemerkten Ordner, einen Klick entfernt. Ist der offene Ordner gemerkt, ist das Symbol gefüllt. Mit dem Kreuz neben einem Eintrag verschwindet er aus der Liste — auch ein Ordner, den es gar nicht mehr gibt.

Lesezeichen auf diesem Gerät gelten in jedem Dateibrowser, gleich zu welchem Host. Lesezeichen auf einer Gegenstelle gelten nur für diesen Host: /var/www auf web-01 sagt nichts über db-primary. Das gilt auch, wenn der Host links als zweite Gegenstelle steht.

Lesezeichen bleiben auf dem Gerät und werden nicht synchronisiert. Ein lokaler Pfad unter Windows ist auf dem Telefon kein Ort.

Ordner anlegen

Der Knopf steht über beiden Spalten — auf jeder Gegenseite und auf diesem Gerät. Der Name wird geprüft, bevor er hinausgeht: kein Schrägstrich, kein Zeilenumbruch, kein führender Bindestrich. Was hier durchgeht, macht auch dem nächsten Kommandozeilenwerkzeug keinen Ärger.

Auf diesem Gerät kommen unter Windows dessen eigene Regeln dazu: keines der Zeichen < > : " | ? *, kein Punkt am Ende und keiner der reservierten Gerätenamen (con, nul, com1 und die übrigen). Ein Ordner mit einem solchen Namen ließe sich anschließend weder öffnen noch löschen.

Gelöscht wird nicht rekursiv

Ein rm -rf mit einem Klick ist die Art Bequemlichkeit, die man genau einmal bereut.

Übertragen dagegen schon: Ganze Ordner gehen in beide Richtungen, ohne Verknüpfungen zu verfolgen — ein Symlink auf / machte aus einem Ordnerdownload sonst einen Systemdownload.

Bearbeiten und zurückschreiben

Holt eine Datei, öffnet sie im zuständigen Programm und bietet danach das Hochladen an. Zurückgeschrieben wird nur nach Rückfrage und nur, wenn sich der Inhalt geändert hat: Viele Editoren fassen die Datei auch dann an, wenn man nur hineingesehen hat, und ein Upload je Blick wäre auf einer Produktionsmaschine nichts, was man sich wünscht.

Eine eigene Verbindung

Der Dateibrowser hat seine eigene SSH-Verbindung. Das ist Absicht: Eine Übertragung, die zehn Minuten läuft, darf nicht enden, weil jemand einen Terminal-Tab geschlossen hat.

Sie hängt am Browser und damit an seinem Reiter beziehungsweise an der Spalte, in der er steht: Wer den Reiter schließt, schließt die Verbindung. Ein Reiterwechsel tut das nicht — der Browser bleibt im Baum, auch wenn gerade etwas anderes zu sehen ist.

Das gilt auch für den Browser neben dem Terminal — er teilt sich die Breite mit ihm, aber nicht die Verbindung. Ist neben dem Terminal kein Platz für zwei Spalten, stehen sie untereinander, die Gegenseite oben.

Dem Terminal folgen

Der Haken Terminal folgen lässt den Browser mitwandern: cd /var/log im Terminal, und daneben steht /var/log.

Wie das geht, ist der Punkt, an dem man ehrlich sein muss. Ein Terminal weiß nicht, wo die Shell steht — es sieht nur Bytes. Der eingebürgerte Weg ist OSC 7: Die Shell meldet ihr Verzeichnis bei jedem Prompt in einer Escape-Sequenz, die niemand sieht. Nicht jede Shell tut das von selbst.

Deshalb schickt tessera beim Einschalten des Hakens einen sichtbaren Befehl in die Sitzung, der die Meldung an den Prompt hängt (bash und zsh). Er steht danach im Puffer — das ist der Preis dafür, das Verzeichnis zu wissen statt es zu raten. Ein führendes Leerzeichen hält ihn bei HISTCONTROL=ignorespace aus dem Verlauf heraus.

Läuft im Vordergrund etwas auf dem Alternativpuffer — vim, less, htop —, wird nichts geschickt: Die Zeile wäre dort kein Befehl, sondern eine Reihe Tastendrücke in einem fremden Programm. Meldet die Gegenseite gar nichts, bleibt es beim Heimatverzeichnis. Ein geratener Pfad wäre schlimmer als keiner.

Antwortet die Shell auf diesen Befehl nicht, sagt tessera es: Im Puffer steht dann Diese Shell meldet ihr Verzeichnis nicht. Das ist der Fall bei fish, csh und jeder Gegenseite ohne POSIX-Shell — und vorübergehend auch dann, wenn im Vordergrund noch ein Befehl läuft, der die Zeile erst später ausführt. Der Haken bleibt gesetzt; sobald die Meldung kommt, wandert der Browser mit. Ein Haken auf „folgt“ über einem Browser, der stillsteht, ließe den Fehler an der falschen Stelle suchen.

Auf dem Telefon

Der lokale Dateibrowser sieht dort nur den Sandbox-Ordner der App — das ist die Regel des Betriebssystems, kein Schalter. Der Weg nach draußen führt über den Systemwähler (herein) und das Teilen-Blatt (hinaus). Process.run gibt es nicht, und HOME ist leer.

Mehr dazu unter Auf dem Telefon.

Pfade

Entfernte Pfade werden ausschließlich mit Schrägstrichen gebildet, nie über die Pfadfunktionen des lokalen Betriebssystems. Unter Windows entstünden sonst Backslashes, die auf der Gegenseite Teil des Dateinamens werden statt Trenner zu sein.