ssh-completion mit zsh

Etwas was mich schon immer gestoert hat, wenn ich Dateien per scp kopierte, war die Tatsache, dass ich die Ordnerstruktur des Ziel-Rechners immer auswendig wissen muss, damit der scp-Befehl nicht fehlschlaegt. Dass ist noch ertraeglich, wenn ich mit der dortigen Ordnerstruktur vertraut bin, oder diese sich an die File-Hirarchy-Standards haelt. Aber sobald keines dieser Kriterien zutraf, musste ich mich stets zuerst per ssh auf dem Host einloggen, um mir den Zielordner rauszusuchen, um dann erst im zweiten Schritt die Datei(en) kopieren zu koennen. (Oft habe ich den midnight commander benutzt um mich per ssh durch die Ordner zu hangeln, aber das ist auch alles andere als “mal-eben-schnell” zu machen)
Das sahen wohl auch die zsh-Entwickler aehnlich und haben ihrer Shell einen Completion-Mechanismus dafuer spendiert: Dadurch kann ich beim Tippen des scp-Befehls mir das Zielverzeichniss genauso vervollstaendigen lassen, wie ein lokales Verzeichniss! Und dazu gehoert noch nicht mal viel; der Mechanismus ist aktiviert, sobald man die Completion-Maschinerie von zsh aktiviert hat:

#autoload -U compinit; compinit

Beispiel:

#scp ~/.zshrc Rechner1:/ho[TAB]
#scp ~/.zshrc Rechner1:/home/ho[TAB]
#scp ~/.zshrc Rechner1:/home/hogdarog/[ENTER]

Voraussetzung ist natuerlich, dass ein ssh-agent laeuft, sonst kann man nach jedem [TAB]-Druck sein Passwort eingeben ;-}

Noch komfortabler wird es, wenn man unter verschiedenen Benutzernamen auf unterschiedlichen Hosts arbeitet:
Dann kann man sich naemlich beide Teile komplettieren lassen:

#ssh r[TAB]
#ssh root@Re[TAB]
#ssh root@Rechner1[ENTER]

Der erste [TAB]-Druck komplettiert natuerlich Benutzer- UND Rechnernamen, da die zsh ja noch nicht wissen kann, ob ein Aufruf nur mit Rechnername (#ssh Rechner1) kommt, oder ob ein Benutzer vorangestellt werden soll. In der zweiten Zeile kann nur noch ein Rechnername komplettiert werden…

Feine Sache das!
Caveat: Sind die Benutzer auf dem lokalen Rechner nicht bekannt, so funktioniert das Verfolstaendigen nicht – da hilft es nur, eine bestimmte Benutzer-/Rechnernamen-Kombination in der ~/.ssh/config abzulegen:

Host Rechner1
User Benutzer1

So kann man den Benutzernamen weglassen; ssh sucht sich den schon aus der config raus. Sprich, sobald ich mich per “ssh Rechner1″ auf Host “Rechner1″ verbinde, benutzt ssh den Username “Benutzer1″

PS: Ich weiss leider nicht, seit welcher Version dieser Mechanismus eingebaut ist – ich benutze derzeit zsh 4.2.5
Falls die User-/Hostname-completion noch nicht installiert ist, kann man sie selbst initialisieren; Siehe dazu das zsh-wiki: http://zshwiki.org/home/examples/compsys/hostnames


Über diesen Beitrag


  1. Otto Normal 28.9.2007 / 13:35

    > Voraussetzung ist natuerlich, dass ein ssh-agent laeuft,

    OK, starte ich mal einen (weiteren) “ssh-agent”en; da tut sich aber
    nichts: Enter passphrase, Enter passphrase …

    Sollte ich jemals rausfinden, wie das funktioniert, komme ich zurück und beschreibe es. Versprochen!

  2. hogdarog 2.10.2007 / 14:10

    Hilft es, wenn du `eval ssh-agent` (Beachte die Backticks) eingibtst?

    Such evtl. mal nach “screen ssh-agent reconnect” bei Google-Groups (Thread “screen 3.7.1 and ssh-agent”)

  3. celpjefscycle 12.1.2008 / 0:11

    Thanks for information.
    many interesting things
    Celpjefscylc

  4. Feh 16.3.2008 / 14:27

    ssh-agent ist gar nicht vonn�ten, wenn man nur kein Passwort eingeben muss. Da man in der Regel ja schon eine Verbindung zu dem Rechner, von dem man Dateien kopieren will, aufgebaut hat, so kann man (wenn richtig konfiguriert) �ber diese Master-Connection alle Dateien �bertragen, auch ohne Eingabe von Passwort. Der entsprechende Eintrag in der ~/.ssh/config w�rde so aussehen:

    Host Rechner1
    HostName 10.0.1.23
    User root
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p

    Die beiden letzten Zeilen sind dabei die wichtigen…

Hinterlasse einen Kommentar

XHTML: Folgende Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>




Safari hates me