我配置了一些服务器~/.ssh/config
,例如alpha
和beta
。我如何配置 Bash,以便命令和自动完成已配置服务器的名称?$ ssh alTab
$ scp file.tgz alTab
我不想将服务器添加到其他每次添加一个文件(即 Bash 数组),因为我们定期添加和删除服务器,并且列表相当大。
这是在 Kubuntu 12.10 上,我确实有bash 完成安装。
答案1
找到了!!
好像在Ubuntu下中的条目~/.ssh/known_hosts
经过哈希处理,因此 SSH 完成无法读取它们。这是一个功能,而不是一个错误。即使通过添加HashKnownHosts no
,我~/.ssh/config
也/etc/ssh/ssh_config
无法阻止主机哈希。
但是,我感兴趣的主机也在 中找到~/.ssh/config
。下面是一个 Bash Completion 脚本,它从该文件中读取条目:
_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
将该脚本放入/etc/bash_completion.d/ssh
,然后使用以下命令获取它:
$ . /etc/bash_completion.d/ssh
我发现本指南(Archive.org 副本)是无价的,如果没有它我就无法编写这个脚本。谢谢史蒂夫·肯普感谢写了那本很棒的指南!
答案2
预包装
您没有说明您正在使用什么发行版,但在我的 Fedora 19 系统上,我安装了以下软件包,bash-completion
它通过此完成规则文件提供此功能:
/usr/share/bash-completion/completions/ssh
这是我安装的包:
$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch
如果您查看该规则文件,您将看到询问该$HOME/.ssh/config
文件的节:
$ 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"
滚动你自己的
我还发现了这个要点,known_hosts_autocomplete.sh,除了$HOME/.ssh/known_hosts
文件之外,它会执行类似的操作。
# 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
$HOME/.ssh/config
如果由于某种原因您无法找到ssh
已预打包的完成规则文件,您可以使用您的文件执行类似的操作。
答案3
我发现自动完成功能不起作用,因为 Ubuntu 对已知主机进行了哈希处理。你可以加
Host *
HashKnownHosts no
到您的.ssh/config
文件,但现有主机不会被散列。
答案4
在 Ubuntu 14.04 上,ssh
自动完成您中提到的服务器~/.ssh/config
当我意识到我经常访问的服务器中只有一台是自动完成的时,我注意到了这一点。两者之间的唯一区别是 ssh 配置文件中与身份验证相关的条目。当我向其他服务器的配置文件添加新条目时,它也开始自动完成。
以下是针对那些提出问题的人的条目:
HOST server-name
GSSAPIAuthentication=no
如果您在配置中指定的内容很重要(当然,只要它仍然有效),我会感到非常惊讶。