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

pra*_*tri 8 bash ssh zsh autocomplete

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

jas*_*yan 9

bash补包包括用于完井ssh指令,包括:

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

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


kwa*_*ick 8

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
Run Code Online (Sandbox Code Playgroud)

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

编辑

我正在使用ohmyzsh的完成脚本:

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
Run Code Online (Sandbox Code Playgroud)


dot*_*hen 6

复制自我在 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
Run Code Online (Sandbox Code Playgroud)

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

$ . /etc/bash_completion.d/ssh
Run Code Online (Sandbox Code Playgroud)

我发现本指南非常宝贵,没有它我就无法编写脚本。感谢Steve Kemp编写了那本了不起的指南!

  • +1 但我会用 `opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')` 替换 awk 行,因为 `~/.ssh/config` 语法允许对于一行上的多个名称 (2认同)