Ich versuche, meine ~/.ssh/config
Datei zu erstellen, um mein Arbeitsleben auf der Serververbindung zu vereinfachen.
In Mavericks funktionierte alles einwandfrei und mit dem tabkonnte ich den Hostnamen mit einer Datei wie dieser automatisch vervollständigen:
Host test-host-name
HostName 192.168.1.2
User root
Die gleiche Konfiguration auf Yosemite hat ein anderes Verhalten. Wenn ich ssh t
auf der Shell tabeingebe, wird der Hostname nicht automatisch vervollständigt.
Weiß jemand, ob sich in Yosemite etwas geändert hat und ich jetzt etwas tun muss, damit es funktioniert?
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 zu Ihrer hinzu ~/.bash_profile
:
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
(Bearbeiten: brew tap homebrew/completions
ist seit 2018 veraltet.)
Ich nehme an, die Shell Ihres Mac ist Bash.
Sie müssen den ssh-Befehl abschließen, für weitere Details können Sie lesenman 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 source
die Datei benötigen, um den neuen Befehl in Ihr Terminal zu laden. oder Sie können diesen Code in .bash_profile einfügen
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")
.bash_profile:21: command not found: complete
auf dem M1 MacAus diesem Artikel auf MacWorld .
Folgendes kopieren/einfügen 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
Sie müssen dann entweder Ihr Terminal neu starten oder tippen source ~/.bash_profile
(beachten Sie, dass letzteres nur in Ihrem aktuellen Tab funktioniert).
Zu Ihrer Information, ich bin mir nicht sicher, wie ich direkt auf Nelsons Antwort 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, ^M
wurde an alle Hostnamen aus meiner Konfigurationsdatei angehängt . Ich musste entweder \r
zu meiner Variablen hinzufügen oder alle Instanzen von aus der Ausgabe der zweiten $IFS
entfernen/ersetzen . Am Ende habe ich letzteres getan, indem ich hinzugefügt habe, dass diese Befehlskette so aussieht:\r
cat
tr '\r' '\n'
cat ~/.ssh/config | \
grep "^Host " | \
awk '{print $2}' | \
tr '\r' '\n'
Nelsons Antwort (oben) sagt Ihnen nicht, welche macOS-Version er verwendet.
Für macOS 10.14 nach der Installation bash-completion
mit:
brew install bash-completion
Das Installationsprogramm sagte mir, ich solle diese Zeile zu meinem .bash_profile hinzufügen (das ich stattdessen in mein .profile eingefügt habe) und es hat funktioniert:
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
Wenn Sie MacPorts verwenden :
$ sudo port install bash-completion
Fügen Sie dann Folgendes zu Ihrem ~/.bash_profile hinzu:
if [ -f /opt/local/etc/bash_completion ]; then
. /opt/local/etc/bash_completion
fi
Vorhandene Antworten erscheinen mir wie Hacks. Der richtige Weg ist, OpenSSH mit editline/readline/history-Unterstützung zu kompilieren, so einfach ist das!
Ehrlich gesagt, kann ich unmöglich nachvollziehen, WARUM eine vernünftige Person es ohne dies gebaut hätte, da es alle wünschenswerten Funktionen (Aufwärtspfeil-Befehlsverlauf, Tab-Vervollständigung lokaler und entfernter Dateinamen usw.) ohne Einschränkungen bietet. Ich habe es aktiviert, als ich OpenSSH 8.7p1 auf meinem iPad mit Jailbreak erstellt habe, aber ich bin sicher, dass es überall gleich gut funktioniert.
Sie können Einträge in /etc/hosts hinzufügen und sie bei der automatischen Vervollständigung des Hostnamens verwenden:
"ssh @" + [TAB]
Ein Neustart ist erforderlich, damit das System diese Datei neu laden kann.
Jan Nash
[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
. Könnten Sie erläutern, welche Version (diese oder Ihre) bevorzugt werden sollte und warum?Glücksdonald
if
. Außerdem$(brew --prefix)
wird es funktionieren, wenn Ihr Hombrew nicht auf installiert wird/usr/local
. Sie sollten die gepostete Version als Antwort verwenden.Jakob Wasser