用于通过 SSH 连接到不同主机的 Bash 自动完成功能

用于通过 SSH 连接到不同主机的 Bash 自动完成功能

我有一大堆服务器,我通常ssh一直在使用这些服务器。有什么方法可以使用bashorzsh来保留主机名列表,并且 bash 自动完成功能会遍历文件,并在我键入主机名的前几个字母时为以这些字母开头的框提供建议。

答案1

bash 补全包包含ssh命令的补全,包括:

  • ssh
  • ssh-add
  • ssh-copy-id
  • sshfs

您可以在这里浏览源代码:https://alioth.debian.org/scm/browser.php?group_id=100114

答案2

Zsh补全与所谓的 ssh 书签一起使用。这些是~/.ssh/config.

例如,

  host baz
    hostname 192.168.1.2
    port 22
    user warrick

  host bar
    hostname example.com
    port 2200
    user kevin
    identityfile /home/warrick/.ssh/ec2.pem

man ssh_config查看完整的选项列表。

编辑

我正在使用来自的完成脚本奥梅兹什:

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

以类似的方式ohmyzsh,我将上面的脚本放入~/.zsh/libs/completion.zsh并将其添加到~/.zshrc.

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done

答案3

复制自我自己在 unix.SE 上的回答:

如果你使用的是 Ubuntu 主机,那么你应该知道在 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 | awk '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

将该脚本放入/etc/bash_completion.d/ssh,然后使用以下命令获取它:

$ . /etc/bash_completion.d/ssh

我发现本指南这是无价的,如果没有它我就无法编写这个脚本。谢谢史蒂夫·肯普感谢写了那本很棒的指南!

答案4

为此,请将您想要完成的任何主机放入您的/etc/hosts文件中。

您还需要bash-completion包(包含文件 /etc/bash_completion 和目录 /etc/bash_completion.d)

并在 ~/.bashrc 中获取它(. /etc/bash_completion- 有时它在 /etc/bash.bashrc 或 ~/.bashrc 中被注释掉)。

相关内容