我有一大堆服务器,我通常ssh
一直在使用这些服务器。有什么方法可以使用bash
orzsh
来保留主机名列表,并且 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
如果你使用的是 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 中被注释掉)。