上一期结尾说到了ssh fb-react01-teer.xx.yy.zz, 这样的命令, 但是, 你不觉得这个命令 太长了吗? 后面的xx.yy.zz完全可以忽略的啊.

我们想得到什么

就是使得上面的命令, 做一些简化, 例如ssh fb-react01-teer, 我们希望也能达到 一样的效果, 这种方式的处理, 每次可以少写许多内容了.

要如何实现呢?

首先, 我们需要了解到, OpenSSH是使用了TCP连接, TCP连接依靠的是IP, 并不是主机名? 但是我们如何通过主机名获取IP呢? 网络知识扎实的话, 应该是可以考虑到hosts文件的. 这里, 我采用一种更为直接的方式: getent命令

1
2
3
4
5
6
7
# 类似得到一条hosts记录
~ ❤ getent hosts fb-react01-teer.xx.yy.zz
59.143.138.01 fb-react01-teer.xx.yy.zz

# awk取出IP
~ ❤ getent hosts fb-react01-teer.xx.yy.zz | awk '{print $1}'
59.143.138.01

现在我们已经可以通过缩写的用户名, 得到具体的IP地址了, 而这个IP地址要怎样告诉 OpenSSH呢.

这里, 算是ProxyCommand的一个奇特用法了.

1
2
3
4
5
6
7
Host gg-* ms-* fb-*
ProxyCommand nc $(getent hosts %h.xx.yy.zz | awk '{print $1}') %p

Host gg-* ms-* fb-*
User corvo
Port 22000
IdentityFile ~/.ssh/id_rsa_test

通过配合这两个配置, 你就可以使用ssh fb-react01-teer进行连接了, 有一种奇特怪异 的气息, 但功能实现的很好.

简单扩展

除此之外, ProxyCommand还可以这样使用. 假如某一类机器, 你知道了IP, 也知道了 这一类机器的登录方式与上述的无二, 但是还不知道机器名.

那么你可以这样使用:

1
2
3
4
5
6
7
Host ttt-*
ProxyCommand nc $(sed -e "s/ttt-//g" <<< %h) %p

Host gg-* ms-* fb-* ttt-*
User corvo
Port 22000
IdentityFile ~/.ssh/id_rsa_test

上面所做的, 就是将类似ttt-1.2.3.4这样的IP, 转换成1.2.3.4作为proxy

你可以这样使用:

1
~ ❤  ssh ttt-1.2.3.4

应该还有更多更多的用法可以挖掘.