Ich möchte die Befehlsvervollständigung auf zsh einrichten, um Hostnamen nach der Eingabe anzuzeigen
ssh [TAB]
Nehmen Sie die Namen aus meiner .ssh / config-Datei (und vorzugsweise aus bekannten_Hosts und / etc / hosts und an jedem anderen Ort, der Sinn macht) und präsentieren Sie eine einzige Liste.
Es macht derzeit einiges davon, aber
- Es wird überhaupt keine .ssh / config verwendet
- Es erfordert zuerst einen Benutzernamen, obwohl die Verwendung von .ssh / config die Eingabe von Benutzernamen unnötig macht
- Es werden mehrere Listen angezeigt (wahrscheinlich eine von bekannten_Hosts und eine andere von / etc / hosts, aber das habe ich nicht überprüft.)
Daher möchte ich bekannte Benutzernamen sowie bekannte Hostnamen in die (vorzugsweise einzelne) Liste aufnehmen, nachdem ich ssh [TAB] eingegeben habe.
(Ich komme vor Google hierher, weil 1) die Antwort hier gespeichert wird und 2) sie wahrscheinlich effizienter ist. Wenn sonst niemand antwortet, werde ich die Antwort suchen.)
ssh
shell
zsh
command-line-interface
Bilderstürmer
quelle
quelle
Antworten:
Hier ist der relevante Teil von mir
.zshrc
. Es hat sich seit 2002 nicht geändert, daher könnte ich es heute anders schreiben, aber es funktioniert immer noch, um Hostnamen von~/.ssh/config
und zu vervollständigen~/.ssh/known_hosts
(fallsHashKnownHosts
deaktiviert - es gab es damals nicht).quelle
Die Funktion, die die
ssh
Vervollständigung bereitstellt, befindet sich/usr/share/zsh/functions/Completion/Unix/_ssh
auf meinem System unter.Weitere Informationen finden Sie auch
man zshcompsys
in der Dokumentation (insbesondere suchen Sie nach "Host", das an mehreren Stellen angezeigt wird, und nach "ssh", das an mehreren Stellen angezeigt wird).Es ist möglich, dass das Hinzufügen eines
zstyle
Befehls zu Ihrem Befehl~/.zshrc
das tut, wonach Sie suchen, ohne die Abschlussfunktion ändern zu müssen.quelle
/usr/share/zsh/4.3.9/functions/_ssh
Mac OS X (Version anpassen)Ich mache dies mit einer Liste aller Hosts auf einer bestimmten Domain mit dig. Sie können die folgende Funktion durch ein beliebiges Suchsystem ersetzen, einschließlich Ihrer Hosts-Datei oder einer statischen Liste:
Hinweis: Der obige Code ersetzt möglicherweise nicht das gesamte System für den Befehl ssh in Ihrer Konfiguration. Wenn Sie Probleme damit haben, versuchen Sie, den Befehl "ssh" in einen anderen zufälligen Befehl wie "mycompletetest" zu ändern, und prüfen Sie, ob die Vervollständigung dafür funktioniert.
Beachten Sie auch, dass dies die DNS-Zonenübertragung bei jedem Abschluss durchführt! Wenn Sie dies häufig oder in einer ziemlich statischen Domäne verwenden, ist es sinnvoll, die Suche durchzuführen und das Ergebnis zu speichern. Setzen Sie dann in Ihrer Suchfunktion einfach reply = zone_result.
quelle
dig axfr mydomain.com @ns1.mydomain.com
. Stellen Sie sicher, dass Sie dies manuell ausführen können und ein Teil der Ausgabe eine Liste der in dieser Domäne registrierten Hosts und ihrer A- oder beliebigen Datensätze sein sollte. Das war es, wonach ich gesucht habe und dann nur den Hostnamen-Teil abgeschnitten habe, nicht den vollständig qualifizierten Datensatz.Ich mag es, meine Hash-
known_hosts
Datei zu behalten und möchte sie lieber nichtHashKnownHosts
ausschalten. Ich hatte festgestellt, dass das Aussäen von @Gilles mit dem, was bereits in meiner Geschichte enthalten ist, für meine Bedürfnisse sehr effektiv war.Außerdem, FWIW, habe ich Folgendes für Bash verwendet:
quelle