如何在 bash 上编辑 ssh 的命令完成?

如何在 bash 上编辑 ssh 的命令完成?

(我有问了有关 zsh 的这个问题但是我也使用 bash 并且发现它在那里也很有用——我猜很多人也会这么认为,因为 bash 比 zsh 拥有更多的用户。)

我想在 bash 上设置命令完成,以便在输入后显示主机名

ssh [TAB]

从我的 .ssh/config 文件中取出名称(最好是从 known_hosts 和 /etc/hosts 以及其他有意义的地方取出)并提供一个列表。

目前它已经实现了部分功能,但是

  1. 它根本不使用 .ssh/config
  2. 它首先需要输入用户名,尽管使用 .ssh/config 就不需要输入用户名了
  3. 它提供了多个列表(可能一个来自known_hosts,另一个来自/etc/hosts,但我还没有验证)

因此,我希望在输入 ssh [TAB] 后在(最好是单个)列表中包含已知用户名以及已知主机名

(我先来这里,然后才使用 Google,因为 1)这样答案就会存储在这里,2)这样可能效率更高。如果没有其他人回答,我会寻找答案。)

答案1

不久前我写了这个由两部分组成的指南:

http://www.debian-administration.org/article/316/An_introduction_to_bash_completion_part_1

http://www.debian-administration.org/article/317/An_introduction_to_bash_completion_part_2

它解释了如何编写完成脚本 - 尽管前面的答案表明了你想要什么应该已经可供您使用。

答案2

这是我在.bashrcssh 主机名补全中所包含的内容:

SSH_COMPLETE=( $(cut -f1 -d' ' ~/.ssh/known_hosts |\
                 tr ',' '\n' |\
                 sort -u |\
                 grep -e '[:alpha:]') )
complete -o default -W "${SSH_COMPLETE[*]}" ssh

答案3

bash 补全已经提供了此功能。如果你想编辑其功能,实际文件是/etc/bash_completion.d/ssh

这是由包提供的bash 完成

输入 ssh < TAB > 时,它将在一个列表中列出 /etc/hosts 和 ~/.ssh/config 中的所有主机。

如果您已经为给定主机指定了用户,则在使用 ssh 时无需指定该用户。

因此,如果你想 ssh 到服务器 brandon

输入 ssh br< TAB >,只要该主机位于 /etc/hosts 或 ~/.ssh/config 中,它就会自动完成单词 brandon。

答案4

如果你使用的是 Mac,则可以使用 Homebrew 来安装 bash-completion:

brew install bash-completion

将以下内容添加到 ~/.bash_profile

if [ -f /usr/local/etc/bash_completion ]; then
. /usr/local/etc/bash_completion
fi

如果你已经使用 MacPorts 安装了 bash-completion,请将其添加到 bash_profile 中

if [ -f /opt/local/etc/bash_completion ]; then
. /opt/local/etc/bash_completion
fi

现在您有了 Richard Holloway 所谈论的包/功能。

相关内容