为什么某些ssh会话提供自动完成功能,而另一些则没有?


10

非常新手的问题!

我将连接到两个不同的服务器,这两个服务器都是同一Amazon AWS集群的一部分。他们不是由我经营的。

在一个ssh会话中,终端让我自动完成。在另一届会议上,它没有-我希望这样做。

为什么会这样-服务器管理员是否设置了此选项?

而且我能做些什么吗?

谢谢!

Answers:


15

这实际上不是编程问题,但与您的shell有关。您可以尝试启动bash外壳程序(通过bash在提示符下键入),看看是否可以自动完成。

如果可行,则可以which bash用来验证其位置,然后chsh -s /bin/bash永久设置外壳。

也可以在中找到可用的shell列表/etc/shells


由于某种原因,我无法更换外壳。有没有办法以root身份执行此操作?You may not change the shell for 'counterstrike'.
托马什Zato -恢复莫妮卡

3

它是ssh会话中使用的shell及其配置的组合。

虽然您的外壳可能支持自动补全功能,但可能没有为此配置它。如果您使用的是bash shell,则可以为以下内容编辑本地.bashrc文件以提供自动完成功能。

# enable bash completion in interactive shells
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

1
bash完成包仅用于更高级的完成,例如命令行选项,服务器名称,VCS存储库目录等。没有它,命令,目录,文件名,变量和用户名的完成将无法完成。
ak2

2

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

似乎特别是在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编写了出色的指南!


1

IIRC它也可能是ssh哈希〜/ .ssh / known_hosts中的主机名的问题

我知道的大多数安装都使用〜/ .ssh / known_hosts作为要完成的可用主机列表的源,但是某些系统也开始设置“ HashKnownHosts yes”,这禁止使用known_hosts作为源...。

如果您已知的主机行以类似

|1|BWO5qDxk/cFH0wa05JLdHn+j6xQ=|rXQvIxh5cDD3C4

然后哈希被激活。

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.