Die Tab-Vervollständigung für in ~ / .ssh / config definierte Hosts funktioniert unter Yosemite nicht mehr

38

Ich versuche, meine ~/.ssh/configDatei zu erstellen, um mein Arbeitsleben auf der Serververbindung zu vereinfachen.

In Mavericks funktionierte alles einwandfrei und mit der konnte tabich den Hostnamen mit folgender Datei automatisch vervollständigen:

Host test-host-name
    HostName 192.168.1.2
    User root

Dieselbe Konfiguration unter Yosemite hat ein anderes Verhalten. Wenn ich ssh tauf der Shell tabtippe, wird der Hostname nicht automatisch vervollständigt.

Weiß jemand, ob sich in Yosemite etwas geändert hat und jetzt muss ich etwas tun, damit es funktioniert?

RikyTres
quelle

Antworten:

37

Sie können die Bash-Shell-Vervollständigung aktivieren, indem Sie bash-completionüber brew installieren :

brew install bash-completion

Fügen Sie dann Folgendes hinzu ~/.bash_profile:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi

Quelle

(Bearbeiten: brew tap homebrew/completionswird ab 2018 nicht mehr unterstützt.)

Danny Armstrong
quelle
+1 :) Bei der Installation von bash-completion-1.3.3.high_sierra sollte ich hinzufügen [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion. Könnten Sie erläutern, welche Version (die oder die Ihre) bevorzugt werden soll und warum?
Jan Nash
15

Ich gehe davon aus, dass die Shell Ihres Mac bash ist.

Sie müssen den Befehl ssh ausführen, um weitere Informationen zu erhalten man complete

_complete_ssh_hosts ()
{
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        comp_ssh_hosts=`cat ~/.ssh/known_hosts | \
                        cut -f 1 -d ' ' | \
                        sed -e s/,.*//g | \
                        grep -v ^# | \
                        uniq | \
                        grep -v "\[" ;
                cat ~/.ssh/config | \
                        grep "^Host " | \
                        awk '{print $2}'
                `
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

Vergessen Sie nicht, dass Sie sourcedie Datei benötigen, um den neuen Befehl in Ihr Terminal zu laden. oder Sie können diesen Code in .bash_profile einfügen

Nelson
quelle
Ja, die Muschel ist heftig. Warum musste ich in Maveriks diese Dinge nicht tun?
RikyTres
Nein, ich habe gerade getestet. Ich kann das in Mavericks nicht standardmäßig tun.
Nelson
comp_ssh_hosts=$(awk -F , 'FNR== NR && ! /^#|\[/ {field = $1} FNR != NR && /^Host / {field = $2} {hosts[field]} END {for (host in hosts) {print host}' "$HOME/.ssh/known hosts" "$HOME/.ssh/config")
Bis auf weiteres angehalten.
2

Aus diesem Artikel auf MacWorld .

Kopieren Sie Folgendes, und fügen Sie es ein in ~/.bash_profile:

complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh

Anschließend müssen Sie entweder Ihr Terminal neu starten oder Folgendes eingeben source ~/.bash_profile(letzteres funktioniert nur auf Ihrer aktuellen Registerkarte).

beef_boolean
quelle
Hat bei mir nicht funktioniert. Aber apple.stackexchange.com/a/168168/136365 hat es getan. Ich denke, es ist am besten, sich bei so etwas nicht auf Ruby zu verlassen.
Ben Creasy
0

Zu Ihrer Information, ich bin nicht sicher, wie ich direkt auf die Antwort von Nelson antworten soll, da ich noch nicht genug Reputation aufgebaut habe, um sie zu kommentieren, aber auf meinem Computer, auf dem El Capitan ausgeführt wird, ^Mwurden alle Hostnamen aus meiner Konfigurationsdatei angehängt . Ich musste entweder \rzu meiner $IFSVariablen hinzufügen oder alle Instanzen von \raus der Ausgabe der Sekunde entfernen / ersetzen cat. Letztendlich habe ich Folgendes hinzugefügt tr '\r' '\n', um die Befehlskette so aussehen zu lassen:

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'
Ian Bui
quelle
-1

Sie können Einträge in / etc / hosts hinzufügen und sie in der automatischen Vervollständigung des Hostnamens verwenden:

"ssh @" + [TAB]

Zum erneuten Laden dieser Datei ist ein Neustart erforderlich.

lukdz
quelle