我想尝试建立一种简单的方法来管理我的 SSH 代理设置。我发现我经常想从三个不同的位置通过 SSH 连接到我的服务器 - 两个位置各自都有自己的代理服务器,我需要使用 corkscrew 才能连接到外部世界,而另一个位置根本没有代理服务器。有没有办法可以设置我的 ~/.ssh/config 文件来识别要使用哪个 ProxyCommand?我想这样做的原因是我想设置 Fetchmail 通过 SSH 隧道穿过我的服务器(使用 crontab),但无论我在哪个网络上,我都无法弄清楚如何使它工作。
干杯。
答案1
.ssh/config
您可以在您的:中进行每个主机配置:
Host ex1
HostName proxied.example.com
User myuser
ProxyCommand /usr/local/bin/corkscrew proxy.example.com 8080 %h %p
Host ex2
HostName nonproxy.example.com
User myuser
IdentityFile id_rsa
所以
ssh ex1
将 ssh 连接到proxied.example.com
并调用螺旋代理,并且
SSH EX2
将 ssh 到nonproxy.example.com
并使用您文件夹中的身份文件.ssh
。
自动检测
corkscrew 代理的作用是通过本地代理创建连接,并接受 ssh 连接所需的标准输入。您可以使用任何内容作为 ProxyCommand,只要它以某种方式连接到远程 ssh 服务器,并接受标准输入的输入。
例如,您可以使用 netcat 建立与远程主机的连接,然后 ssh 将通过标准输入与 netcat 通信:
ProxyCommand nc %h %p
当您使用此代理命令通过 ssh 连接到服务器时,ssh 将调用 nc 与端口 22 上的远程主机建立 tcp 连接,然后 ssh 将通过 nc 的标准输入发送其命令。
这毫无用处,让 nc 建立 tcp 会话而不是 ssh 不会给你带来任何好处。除非你可以创建一个名为“proxytest”的包装器脚本,例如,该脚本会进行测试以查看是否可以使用 nc 建立直接连接,否则尝试使用 corkscrew - 类似于:
if nc -z $1 $2; then
exec nc $1 $2 # try to connect directly
else
exec corkscrew $3 $4 $1 $2 # set up proxy connection
因此,如果其中任何一个有效,那么就会有一个可用的标准输入,ssh 可以使用它进行连接 - 无论是来自 netcat 的还是来自 corkscrew 的。因此,您的 ssh 配置将具有:
ProxyCommand proxytest %h %p proxy.example.com 8080
有现成的脚本这里您可能想要尝试一下,并进行适当的测试和错误检查。向下滚动到“其他技巧”部分。