如何修复此 SSH 主机名选项卡完成脚本?

如何修复此 SSH 主机名选项卡完成脚本?

找到以下脚本(对于 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

相关内容