当我跑
FOO=$(ssh -L 40000:localhost:40000 root@1.2.3.4 cat /foo)
Run Code Online (Sandbox Code Playgroud)
我得到 的内容/foo
,但随后断开连接。
我想要做的是以某种方式获取内容/foo
并保持连接打开,以便端口 40000 仍然转发到同一台服务器。这可能吗?
你可能会问,为什么不像这样发出两个 ssh 连接
FOO=$(ssh root@1.2.3.4 cat /foo)
ssh -L 40000:localhost:40000 root@1.2.3.4 -f -N
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我不能这样做的原因是 ip ( 1.2.3.4
) 是一个负载均衡器,它将连接转发到多个随机后端。每次ssh到1.2.3.4
不同的机器,/foo
每台机器的内容都不一样。此外,我通过转发端口 (40000) 发送的数据取决于/foo
. 如果我获取/foo
机器 A 上的内容,然后通过端口 40000 将数据发送到机器 B,则无法正常工作。
您所描述的称为 SSH 多路复用。
我在 devops 设置中使用该设置来缓存我与任何 VM 的连接。
通过这种方式,我将相同的连接重用长达 30 分钟/缓存连接,而无需在每个新命令中重新协商整个 SSH 连接(并验证用户)。
当连续向 VM/服务器发送(多个)命令时,它极大地提高了我的速度。
设置在客户端完成,对于 30 分钟的缓存,设置可以通过以下方式完成/etc/ssh/ssh_config
:
ControlPath ~/.ssh/cm-%r@%h:%p
ControlMaster auto
ControlPersist 30m
Run Code Online (Sandbox Code Playgroud)
该MaxSessions
参数ssh_config
也定义了允许同时连接的多路复用连接数;默认值为 10。如果您需要更多并发缓存连接,您可能需要更改它。
例如,对于最多 20 个缓存连接:
MaxSessions 20
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅OpenSSH/Cookbook/Multiplexing
SSH 多路复用的一个优点是消除了创建新 TCP 连接的开销。
...
第二次和以后的连接将重复使用已建立的 TCP 连接 > 并且不需要为每个新的 SSH 连接创建新的 TCP 连接。
另请参阅使用 SSH 多路复用
SSH 多路复用是通过单个 TCP 连接承载多个 SSH 会话的能力
如果没有多路复用,每次执行该命令时,您的 SSH 客户端都必须与远程主机建立新的 TCP 连接和新的 SSH 会话。通过多路复用,您可以将 SSH 配置为建立单个 TCP 连接,该连接在特定时间段内保持活动状态,并通过该连接建立 SSH 会话。这可能会导致速度提高,当对远程 SSH 主机重复运行命令时,速度会增加。
最后,由于多路复用使客户端和服务器之间的 TCP 连接保持打开状态,因此只要缓存处于打开/活动状态,您就可以保证与负载均衡器中的同一台机器进行通信。
归档时间: |
|
查看次数: |
7581 次 |
最近记录: |