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?

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.)


+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


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).


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'

-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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.