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

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

非常新手的问题!

我正在 SSH 到两个不同的服务器,它们都属于同一个 Amazon AWS 集群。它们不是由我运行的。

在一个 ssh 会话中,终端允许我自动完成。在另一个会话中,它却不允许 - 我希望它允许。

为什么会这样 - 这是服务器管理员设置的选项吗?

我能做些什么呢?

谢谢!

答案1

这实际上不是一个编程问题,但它与你的 shell 有关。你可以尝试启动 shell bash(通过bash在提示符下输入)并查看是否可以自动完成。

如果有效的话,您可以用它which bash来验证它的位置,然后chsh -s /bin/bash永久设置您的 shell。

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

答案2

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

虽然您的 shell 可能支持自动完成功能,但可能未对其进行配置。如果您使用的是 bash shell,则可以编辑本地 .bashrc 文件以提供自动完成功能。

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

答案3

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

似乎特别是在 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

IIRC 也可能是 ssh 对 ~/.ssh/known_hosts 中的主机名进行哈希处理的问题

我知道的大多数安装都使用 ~/.ssh/known_hosts 作为可用主机列表的来源,但有些系统也开始设置“HashKnownHosts yes”,禁止使用 known_hosts 作为来源......

如果你的已知主机行以类似以下内容开头

|1|BWO5qDxk/cFH0wa05JLdHn+j6xQ=|rXQvIxh5cDD3C4

然后散列就被激活了。

相关内容