Bash Auto-Completion-Funktion für SSHing auf verschiedenen Hosts

8

Ich habe eine große Liste von Servern, die ich normalerweise sshständig besuche. Gibt es eine Möglichkeit mit bashoder zshso , dass ich die Liste der Hostnamen und bash Auto-Vervollständigung halte die Datei geht durch und gibt mir einen Vorschlag für die Boxen mit diesen Buchstaben beginnen , wenn ich die ersten paar Buchstaben des Hostnamen eingeben.

pradeepchhetri
quelle

Antworten:

8

ZshDie Fertigstellung funktioniert mit sogenannten SSH-Lesezeichen. Diese sind pro Hostkonfiguration in ~/.ssh/config.

Zum Beispiel,

  host baz
    hostname 192.168.1.2
    port 22
    user warrick

  host bar
    hostname example.com
    port 2200
    user kevin
    identityfile /home/warrick/.ssh/ec2.pem

man ssh_config um eine vollständige Liste der Optionen anzuzeigen.

BEARBEITEN

Ich verwende das Vervollständigungsskript von ohmyzsh :

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

In ähnlicher Weise habe ohmyzshich das obige Skript ~/.zsh/libs/completion.zsheingefügt und hinzugefügt ~/.zshrc.

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done
Kwarrick
quelle
Ich benutze nicht zsh sondern bash ...
Gilles Quenot
Richtig, die Frage des OP ist für bash oder zsh. Mein Kommentar zu Ihrem Beitrag war einfach, ~ / .ssh / config für / etc / hosts zu bevorzugen, wenn dies überhaupt möglich ist, was gemäß seiner Frage bei Verwendung von zsh möglich ist.
Kwarrick
6

Von meiner eigenen Antwort auf unix.SE kopiert :

Wenn Sie sich auf einem Ubuntu-Host befinden, sollten Sie wissen, dass die Einträge in~/.ssh/known_hosts Ubuntu gehasht sind , sodass die SSH-Vervollständigung sie nicht lesen kann. Dies ist eine Funktion, kein Fehler. Selbst durch Hinzufügen HashKnownHosts nozu ~/.ssh/configund konnte /etc/ssh/ssh_configich das Host-Hashing nicht verhindern.

Sie können jedoch die konfigurierten Einträge lesen, aus ~/.ssh/configdenen nicht gehasht wird. Hier ist ein Skript für Bash Completion, das die Einträge aus dieser Datei liest:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config | awk '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

Fügen Sie das Skript ein /etc/bash_completion.d/sshund geben Sie es mit dem folgenden Befehl ein:

$ . /etc/bash_completion.d/ssh

Ich fand diesen Leitfaden von unschätzbarem Wert und hätte ihn ohne ihn nicht schreiben können. Vielen Dank an Steve Kemp für das Schreiben dieses großartigen Leitfadens!

dotancohen
quelle
2
+1, aber ich würde die awk-Zeile durch ersetzen, opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')da die ~/.ssh/configSyntax mehrere Namen in einer einzelnen Zeile
zulässt
@nhed: Danke! Ich wusste nicht, dass das erlaubt war.
Dotancohen
0

Damit dies funktioniert, fügen Sie alle Hosts, die Sie vervollständigen möchten, in Ihre /etc/hostsDatei ein.

Sie benötigen auch ein bash-completionPaket (mit der Datei / etc / bash_completion und dem Verzeichnis /etc/bash_completion.d).

und Quelle in ~ / .bashrc ( . /etc/bash_completion- manchmal ist es in /etc/bash.bashrc oder in ~ / .bashrc auskommentiert).

Gilles Quenot
quelle
4
Ich würde empfehlen, / etc / hosts nicht zu verwenden. Fügen Sie stattdessen sogenannte ssh-Lesezeichen in ~ / .ssh / config hinzu. man ssh_configFür weitere Details, aber es ist weitaus vielseitiger, sodass Sie mehrere Aliase, Benutzernamen, Port und vieles mehr angeben können.
Kwarrick
Wenn ich unter archlinux etwas eingebe, /etc/ssh/ssh_configkann ich nicht für die konfigurierten Hosts arbeiten.
Gilles Quenot
Siehe meine erweiterte Antwort, ich verwende die Fertigstellung von ohmyzsh.
Kwarrick
1
Wenn Sie sich die Quelle ansehen , werden Sie sehen, dass das Skript known_hostsebenso wie die anderen Konfigurationsdateien prüft , z. B.~/.ssh/config
jasonwryan