我找到以下脚本(对于 bash)这使我能够为我连接到的任何主机名(来自~/.ssh/known_hosts
)获得制表符补全:
complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh
但是,问题是在我输入用户名后,制表符补全功能不起作用。
我该如何改进这个,所以如果我输入......
ssh myusername@my
并期望它完成“myhostname.com”它就能这样做吗?
如果它也可以标记整个字符串(user@hostname),那就更好了,但我可以接受这两个选项。如果没有第一个,除非我的主机用户名与本地用户名匹配,否则这没有多大用处。
答案1
默认情况下,known_hosts 文件通常包含 bash_completion 无法解析的哈希条目。
您可以编辑 ssh_config (/etc/ssh/ssh_config) 来设置:
HashKnownHosts no
然后您可能需要清除当前已知的主机文件:
> ~/.ssh/known_hosts
答案2
如果$COMP_WORDBREAKS
包含“@”(这是我系统上的默认设置),则会出现我无法解决的严重问题(按后,Tab一个Enter“@”被删除)。
但是,如果您从该环境变量中删除它,那么这是有效的:
_foo () {
if [[ "$COMP_WORDBREAKS" =~ "@" ]]; then
echo ""
echo '$COMP_WORDBREAKS contains "@"; aborting'
COMPREPLY=()
else
at_in=no
if [[ ${COMP_WORDS[COMP_CWORD]} =~ "@" ]]; then
var="${COMP_WORDS[COMP_CWORD]}"
tail="${var#*@}"
prefix="${var%"$tail"}"
else
prefix=""
fi
COMPREPLY=($(cut -f 1 -d ' ' <~/.ssh/known_hosts |
sed -e 's/,/\n/g' | uniq |
awk -v prefix="${prefix}" '/\[/ {next}; {print prefix $0;}'))
COMPREPLY=($(compgen -W "${COMPREPLY[*]}" "${COMP_WORDS[COMP_CWORD]}"))
fi
}
complete -F _foo ssh