使用IP地址的zsh ssh选项卡自动补全

5

我使用ssh登录多台只有IP地址的机器,但我注意到之前尝试ssh时,Tab键补全不再起作用了。我使用zsh,在ssh时可以自动补全常规域名,但我使用的所有IP机器都无法自动补全了,这是怎么回事?是出了什么问题吗?

  • 操作系统:OS X - 10.9.3
  • 终端工具:zsh - 5.0.2

你的 ~/.ssh/known_hosts 文件的第一列(即第一个空格之前的部分;awk '{print $1}' ~/.ssh/known_hosts)是什么样子的?它包含主机名和 IP 地址(或者可能是逗号分隔的列表),还是只有哈希值(可能以 |1| 开头)? - Adaephon
我有一列主机名和IP地址,里面没有哈希值。唯一奇怪的是[localhost]:2224。 - Mentch
“奇数端口”是非标准端口(2224而不是22)的表示法。它不应该对问题负责,我也有这些问题。为了排除known_hosts的问题,您可以尝试删除所有条目,只留下一个条目,看看行为是否仍然存在。(不要忘记在此之前备份它 :-) ) - Adaephon
2个回答

3

2
你的ssh可能正在对known_hosts中的条目进行哈希处理?
我认为,在ssh方面,最好的用户体验解决方案是创建ssh主机别名,然后只需在命令行中使用该别名。例如,在你的~/.ssh/config文件中添加类似以下内容的命令别名:
Host foo
  # HostName also accepts numeric IP addresses
  HostName XXX.ZZZ.YYY.BBB

那么你只需使用 scp backup.tar foo: 即可。

查看 man ssh_config 以获取更多信息,来自手册:

 HashKnownHosts
         Indicates that ssh(1) should hash host names and addresses when they are added to ~/.ssh/known_hosts.  These hashed names
         may be used normally by ssh(1) and sshd(8), but they do not reveal identifying information should the file's contents be
         disclosed.  The default is “no”.  Note that existing names and addresses in known hosts files will not be converted auto‐
         matically, but may be manually hashed using ssh-keygen(1).  Use of this option may break facilities such as tab-comple‐
         tion that rely on being able to read unhashed host names from ~/.ssh/known_hosts.

好的,忽略上面的内容。我在评论中看到那不是事实,但为了参考仍将其保留。

PS:您始终可以手动设置主机以便zsh完成,方法类似于:

hosts=(foo.bar.com faa.bar.com fee.bar.com)
zstyle ':completion:*:hosts' hosts $hosts

或者进行更复杂的版本,比如在这里描述的https://www.maze.io/2008/08/03/remote-tabcompletion-using-openssh-and-zsh/index.html

(该链接介绍了如何使用OpenSSH和Zsh实现远程Tab补全)

这种方法可以通过创建一个SSH到IP的快捷方式来解决我的问题。但是它并没有解决为什么只有IP地址不能使用Tab键自动补全SSH,而常规域名可以的问题。 - Mentch
你检查过SSH是否正在加密known_hosts中的条目了吗? - Francisco
@Mentch 好的,我在问题的评论中看到你知道 known_hosts 没有被哈希。你正在使用 oh-my-zsh 吗?(这种情况经常会出现问题)。请注意,oh-my-zsh 有代码干扰 ssh 的 ip-completion。 - Francisco
是的,我正在使用 oh-my-zsh。 - Mentch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接