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


8

我有很多我通常ssh一直在访问的服务器列表。有什么方法可以使用bashzsh保留我的主机名列表,bash的自动完成功能会遍历文件,并为我提供一个建议,让我在每次输入主机名的前几个字母时都以这些字母开头。

Answers:


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

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

我不使用zsh但使用bash ...
Gilles Quenot 2012年

是的,OP问题是针对bash或zsh,我对您的帖子的评论只是尽可能地将〜/ .ssh / config偏向/ etc / hosts,根据他的问题,使用zsh时是可能的。
kwarrick 2012年


6

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

如果您在Ubuntu主机上,则应该知道在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 | awk '{print $2}')

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

放入该脚本,/etc/bash_completion.d/ssh然后使用以下命令将其来源:

$ . /etc/bash_completion.d/ssh

我发现该指南非常宝贵,没有它,我将无法编写该脚本。感谢Steve Kemp编写了出色的指南!


2
+1,但我将用awk替换行,opts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')因为~/.ssh/config语法允许在一行上使用多个名称
2015年

@nhed:谢谢!我不知道那是允许的。
dotancohen

0

为此,请将要完成的所有主机都放入/etc/hosts文件中。

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

并在〜/ .bashrc中提供. /etc/bash_completion它(-有时在/etc/bash.bashrc或〜/ .bashrc中将其注释掉)。


4
我建议不要使用/ etc / hosts。而是在〜/ .ssh / config中添加所谓的ssh书签。man ssh_config有关更多详细信息,但它用途更广,允许您指定多个别名,用户名,端口等。
kwarrick 2012年

使用archlinux时,如果将某些东西放入/etc/ssh/ssh_config,则无法完成配置主机的工作。
吉尔斯·奎诺

请参阅我的扩展答案,我正在使用中的完成ohmyzsh
kwarrick 2012年

1
如果您查看源代码,您将看到该脚本known_hosts以及其他配置文件进行检查,例如~/.ssh/config
jasonwryan 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.