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:
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.