Autocomplete-Servernamen für SSH und SCP

61

Ich habe ein paar Server konfiguriert ~/.ssh/config, wie alphaund beta. Wie kann ich Bash so konfigurieren, dass die Befehle ssh al<tab>und scp file.tgz al<tab>die Namen der konfigurierten Server automatisch vervollständigt werden?

Ich möchte die Server nicht bei jedem Hinzufügen zu einer anderen Datei (z. B. einem Bash-Array) hinzufügen, da wir regelmäßig Server hinzufügen und entfernen und die Liste recht umfangreich ist.

dotancohen
quelle
2
Haben Sie das bash-completions-Paket für Ihre Distribution installiert? Ich denke, dies ist Teil der Standard-Vervollständigungsroutinen, obwohl ich es mit zsh verwechseln könnte.
Caleb
Meine Installation macht genau das.
SLM
Dies ist auf Kubuntu 12.10 und ich habe bash-completioninstalliert.
Dotancohen

Antworten:

64

Fand es!!

Es scheint, dass die Einträge~/.ssh/known_hosts in Ubuntu gehasht sind , so dass die SSH-Vervollständigung sie nicht lesen kann. Dies ist eine Funktion, kein Fehler. Selbst durch das Hinzufügen HashKnownHosts novon ~/.ssh/configund konnte /etc/ssh/ssh_configich das Host-Hashing nicht verhindern.

Die Gastgeber, an denen ich interessiert bin, finden sich auch in ~/.ssh/config. Hier ist ein Skript für die Bash-Vervollständigung, 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 ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 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 den folgenden Befehl ein:

$ . /etc/bash_completion.d/ssh

Ich fand dieses Handbuch von unschätzbarem Wert und hätte es ohne dieses Skript nicht schreiben können. Vielen Dank, Steve Kemp, für das Schreiben dieses tollen Leitfadens!

dotancohen
quelle
1
Es scheint, dass in Centos 6-Einträgen in ~ / .ssh / known_hosts Einträge in ~ / .ssh / config überschrieben werden, z. Wenn Sie foo.bar.baz.com in known_hosts haben, entspricht dies dem Ganzen, wenn Sie "ssh foo" <tab> ausführen. Dies ist unerwünscht, wenn Sie einen anderen Benutzer oder andere Einstellungen haben, die Sie in der ssh-Konfiguration anwenden möchten. Wenn Sie einen Eintrag in ssh config haben, der sich nicht ordnungsgemäß vervollständigt, prüfen Sie, ob er in known_hosts vorhanden ist, und löschen Sie ihn. Es sollte jetzt wie gewohnt funktionieren und die Einstellungen aus der Konfiguration übernehmen.
Imran-UK
@ Imran-UK: Es ist bekannt, dass Ubuntu diese vernünftige Sache unter dem Vorwand der Sicherheit nicht tut. Anscheinend geht man davon aus, dass eine böswillige Entität als Benutzer ~ / .ssh / config trotz chmod 0600 im Verzeichnis bearbeiten könnte. Hey, ich war nicht derjenige, der die Entscheidung getroffen hat!
Dotancohen
1
Ich benutze zsh & oh-my-zsh, ich habe gerade entdeckt, dass das Aktivieren des "ssh" -Plugins und das Einfügen von "HashKnownHosts yes" in meine ~ / .ssh / config das Richtige zu sein scheint. Sie können die Shell unabhängig von der Distribution ändern, so dass dies möglicherweise ein Ausweg ist.
Imran-UK,
@ Imran-UK: Tatsächlich habe ich zsh in der Vergangenheit ausprobiert und beabsichtige, es erneut zu versuchen. Ich werde das untersuchen. Shukran mein Freund!
Dotancohen
Ich weiß, dass ich ein bisschen zu spät zur Party komme, aber RHEL 7 /etc/hostsvervollständigt Einträge, die sich in anderen Distributionen befinden , automatisch.
Centimane
16

Vorverpackt

Sie sagen nicht, welche Distribution Sie verwenden, aber auf meinem Fedora 19-System ist das folgende Paket installiert, bash-completiondas diese Funktion über diese Vervollständigungsregeldatei bereitstellt:

/usr/share/bash-completion/completions/ssh

Hier ist das Paket, das ich installiert habe:

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

Wenn Sie diese Regeldatei durchsehen, werden Zeilengruppen angezeigt, die die $HOME/.ssh/configDatei abfragen :

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

Roll deine eigenen

Ich habe auch dieses Gist gefunden, known_hosts_autocomplete.sh , das etwas Ähnliches tut, außer mit der $HOME/.ssh/known_hostsDatei.

# add to ~/.bash_profile, and close/reopen a shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

Sie könnten etwas Ähnliches mit Ihrer $HOME/.ssh/configDatei tun, wenn Sie aus irgendeinem Grund die Vervollständigungsregeldatei für sshbereits vorgefertigte Dateien nicht finden können .

slm
quelle
Danke. Es scheint, dass Ubuntu nicht mit ausgeliefert wird /usr/share/bash-completion/completions/ssh. Könnten Sie die gesamte Datei irgendwo posten, damit ich sie kopieren kann? Vielen Dank!
Dotancohen
Sie können alle Dateien aus diesem Archiv abrufen
slm
Es tut mir leid, dass es mir weh tut, aber selbst das Kopieren der ssh-Datei aus diesem tar-Archiv /usr/share/bash-completion/completions/sshhilft nichts! Der complete -W ...Befehl wird auch nicht über die Bash-Eingabeaufforderung ausgeführt. Worum könnte es hier gehen?
Dotancohen
Danke. Dies scheint eine bekannte Designentscheidung in Ubuntu zu sein. Daher akzeptiere ich die Antwort, obwohl ich für sshoder keine Bash-Vervollständigung erhalten kann scp.
Dotancohen
2
Homebrew für OSX hat auch dies: Bash-Vervollständigung und Zsh-Vervollständigungen
Adam Nelson
7

Ich habe festgestellt, dass die automatische Vervollständigung nicht funktioniert, da Ubuntu bekannte Hosts hasht. Du kannst hinzufügen

Host *
    HashKnownHosts no

Zu deiner .ssh/configDatei werden aber vorhandene Hosts nicht enthasht.

M1ke
quelle
Danke. Ich habe diese Anweisung tatsächlich bereits hinzugefügt ~/.ssh/configund geändert /etc/ssh/ssh_configund die ~/.ssh/known_hostsDatei entfernt. Nach der erneuten Anmeldung an den Servern werden die Hostnamen weiterhin als Hash gespeichert.
Dotancohen
Ich habe meine Antwort bearbeitet. Sie müssen einen Host angeben und die Hash-Direktive darin einbetten. Ich habe nicht angegeben, dass so viele .ssh/configDateien diese Zeile bereits haben werden. Lassen Sie mich wissen, ob das funktioniert.
M1ke
Dies ist definitiv der einfache Weg, es zu tun! Angesichts der Tatsache, dass in (neueren Versionen von) Ubuntu jetzt die ssh-Vervollständigung aktiviert ist, ist dies wahrscheinlich das, was gewünscht wird.
John Montgomery
Wie ich unten hinzugefügt habe, können Sie dies tun, aber Sie sollten es wahrscheinlich nicht tun - Sie müssen es nicht, um die Fertigstellung trotzdem zum Laufen zu bringen. Wenn Sie jedoch nicht einverstanden sind und die vorhandenen Hosts nach dem Hinzufügen der oben genannten Hosts nur ent-hashen möchten, können Sie einfach rm ~ / .ssh / known_hosts ausführen. Dies führt dazu, dass sie jedes Mal neu generiert (ent-hasht) werden Sie melden sich bei einem neuen Server an.
Jamieson Becker
3

So aktivieren Sie die automatische Vervollständigung von ssh in Debian und Ubuntu:

sudo apt-get install bash-completion

Beachten Sie, dass dies im Gegensatz zu den obigen Ausführungen und der ursprünglichen Frage überhaupt nichts mit dem Hashing von known_hosts zu tun hat . Wenn Sie von known_hosts aus automatisch vervollständigen möchten, müssen Sie natürlich das Hashing deaktivieren, aber das wird dringend empfohlen.

Zum Beispiel habe ich:

Host *
    HashKnownHosts yes

in meiner .ssh / config, und ich habe immer noch ssh Auto-Vervollständigung funktioniert gut gegen Hosts in .ssh / config und / etc / hosts aufgeführt. Sie müssen den Host zu .ssh / config hinzufügen, wie im OP angegeben:

Host my-awesome-host Hostname the.real.host.name

(Oder Sie können einen Host-Eintrag zu / etc / hosts hinzufügen, eine weitere Quelle für die Debian / Ubuntu-Skripte.)

Dann können Sie einfach tippen ssh my-awe<tab>und es wird automatisch vervollständigt. Auch dies ist selbst dann der Fall, wenn Sie HashKnownHosts verwenden, was sehr zu empfehlen ist. (Beachten Sie, dass die Bash-Vervollständigung in Ihrer Bash-Shell aktiviert sein muss und Sie diese Skripte wie oben für Ihre Distribution installiert haben müssen.)

Dann fügen Sie diese Zeilen zu Ihrem .bashrces ermöglichen (erfordert eine Abmeldung und melden Sie sich wieder in, oder einfach nur eine neue bashtypisierte in eine neue Shell zu starten. (Sie brauchen nicht zu aktivieren , wenn es bereits in aktiviert ist /etc/bash.bashrcund /etc/profileQuellen /etc/bash.bashrc).

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Dies ermöglicht es ssh Auto - Vervollständigung (unter anderem!) Aus ~/.ssh/config, /etc/hostsusw.

Beachten Sie, dass Debian standardmäßig ash anstatt bash verwendet. Sie können einfach zu bash wechseln:

sudo usermod -s /bin/bash "$USER"

(Sie müssen sich abmelden und erneut anmelden, damit dies wirksam wird.)

Jamieson Becker
quelle
2

Unter Ubuntu 14.04 sshwerden die in Ihrem Browser genannten Server automatisch vervollständigt~/.ssh/config

Ich bemerkte es, als mir klar wurde, dass nur einer der Server, auf die ich normalerweise zugreife, automatisch vervollständigt wird. Der einzige Unterschied zwischen den beiden bestand in einem Eintrag in der SSH-Konfigurationsdatei, der sich auf die Authentifizierung bezog. Als ich der Konfigurationsdatei für den anderen Server einen neuen Eintrag hinzufügte, wurde auch die automatische Vervollständigung gestartet.

Hier ist der Eintrag für diejenigen, die gefragt haben:

HOST server-name 
    GSSAPIAuthentication=no

Ich wäre sehr überrascht, wenn es darauf ankommt, was Sie in der Konfiguration spezifizieren (solange es natürlich noch gültig ist).

Noah
quelle
Danke Noah, was war das für ein Eintrag? Auf meinen 14.04 und 14.10 Systemen funktioniert Autocomplete nicht.
Dotancohen
Ich denke nicht, dass der Eintrag von Bedeutung ist - ich bin mir ziemlich sicher, dass er nur darin enthalten ist - aber ich werde den Eintrag meiner Antwort hinzufügen.
Noah,