我在中配置了一些服务器~/.ssh/config
,例如alpha
和beta
。我怎么可能配置猛砸这样的命令ssh al<tab>
,并scp file.tgz al<tab>
自动完成配置的服务器的名称?
我不想每次添加服务器时都将服务器添加到另一个文件(即Bash阵列)中,因为我们会定期添加和删除服务器,并且列表很大。
bash-completion
安装了。
我在中配置了一些服务器~/.ssh/config
,例如alpha
和beta
。我怎么可能配置猛砸这样的命令ssh al<tab>
,并scp file.tgz al<tab>
自动完成配置的服务器的名称?
我不想每次添加服务器时都将服务器添加到另一个文件(即Bash阵列)中,因为我们会定期添加和删除服务器,并且列表很大。
bash-completion
安装了。
Answers:
找到了!!
似乎在Ubuntu中,其中的条目~/.ssh/known_hosts
是散列的,因此SSH完成无法读取它们。这是一个功能,而不是错误。即使添加HashKnownHosts no
到~/.ssh/config
,/etc/ssh/ssh_config
我也无法阻止主机哈希。
但是,在中也找到了我感兴趣的主机~/.ssh/config
。这是Bash完成的脚本,该脚本从该文件读取条目:
_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
我发现该指南非常宝贵,没有它,我将无法编写该脚本。感谢Steve Kemp编写了出色的指南!
/etc/hosts
,其他发行版可能会做同样的事情。
您没有说要使用什么发行版,但是在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
已预先打包的完成规则文件,则可以使用文件执行类似的操作。
/usr/share/bash-completion/completions/ssh
。您可以将整个文件发布到可以复制的位置吗?谢谢!
/usr/share/bash-completion/completions/ssh
也无济于事!complete -W ...
从Bash提示符运行命令也不会。这里可能是什么问题?
我发现自动完成无法正常工作,因为Ubuntu对已知主机进行哈希处理。你可以加
Host *
HashKnownHosts no
对于您的.ssh/config
文件,但现有主机不会被隐藏。
~/.ssh/config
并更改了中的指令/etc/ssh/ssh_config
,并且删除了该~/.ssh/known_hosts
文件。再次登录服务器后,主机名仍会被散列保存。
.ssh/config
文件已经包含这一行。让我知道是否可行。
要在Debian和Ubuntu中启用ssh自动补全功能:
sudo apt-get install bash-completion
请注意,与上面提到的内容和原始问题相反,这与known_hosts哈希无关。如果要从known_hosts自动完成,则当然必须禁用哈希,但是强烈建议您这样做。
例如,我有:
Host *
HashKnownHosts yes
在我的.ssh / config中,我仍然可以使用ssh自动补全功能来对.ssh / config和/ etc / hosts中列出的主机正常工作。您确实需要按照OP所述将主机添加到.ssh / config中:
主机my-awesome-host主机名the.real.host.name
(或者,您可以将主机条目添加到/ etc / hosts中,这是Debian / Ubuntu脚本的另一个来源。)
然后,您只需键入ssh my-awe<tab>
,它将自动完成。同样,即使您使用HashKnownHosts,也强烈建议这样做。(请注意,需要在bash shell中启用bash补全功能,并且需要专门安装上述脚本以进行分发。)
然后,将这些行添加到您的计算机中.bashrc
以启用它(需要注销并重新登录,或者只需bash
键入一个新的命令即可启动新的Shell。(如果您已经在/etc/bash.bashrc
和/etc/profile
源中启用了它,则无需启用它/etc/bash.bashrc
)。
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
这将使SSH自动完成(除其他事项外!)从~/.ssh/config
,/etc/hosts
等等。
请注意,Debian默认为ash而不是bash。您可以轻松切换到bash:
sudo usermod -s /bin/bash "$USER"
(您需要注销并重新登录才能生效。)
在Ubuntu 14.04上,ssh
自动完成您提到的服务器~/.ssh/config
当我意识到只有我经常访问的一台服务器自动完成时,我注意到了这一点。两者之间的唯一区别是ssh配置文件中与身份验证相关的条目。当我向其他服务器的配置文件中添加新条目时,它也开始自动完成。
这是那些问的人的条目:
HOST server-name
GSSAPIAuthentication=no
如果您在配置中指定了什么,我将感到非常惊讶(当然,只要它仍然有效)。