为什么一些ssh会话提供了自动完成function,有些则没有?

非常新手问题!

我打开了两个不同的服务器,这两个服务器都是同一个Amazon AWS群集的一部分。 他们不是由我经营的。

在一个SSH会话,terminal让我自动完成。 在另一个会议上,它不 – 我希望这样做。

这是为什么 – 这是服务器pipe理员设置的选项吗?

我能做些什么吗?

谢谢!

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

如果可行,你可以使用which bash来validation它的位置,然后用chsh -s /bin/bash来永久设置你的shell。

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

这是在你的SSH会话中使用的shell的组合以及它的configuration。

虽然你的shell可能支持自动完成,但可能没有configuration它。 如果您使用的是bash shell,您可以编辑您的本地.bashrc文件以提供自动完成。

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

IIRC它也可能是一个问题,ssh散列〜/ .ssh / known_hosts中的主机名

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

如果你已知的主机行开始类似的东西

 |1|BWO5qDxk/cFH0wa05JLdHn+j6xQ=|rXQvIxh5cDD3C4 

然后散列被激活。

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

特别是在Ubuntu 中, ~/.ssh/known_hosts中的条目被散列 ,所以SSH完成无法读取它们。 这是一个function,而不是一个错误。 即使通过添加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 

我发现这个指南是非常宝贵的,如果没有它,我将无法编写脚本。 谢谢史蒂夫·坎普写这个了不起的向导!