如何重用SSH连接以使用多路复用来加快远程登录过程

时间:2020-01-09 10:42:21  来源:igfitidea点击:

如何重用相同的ssh连接(多路复用)来加快OpenSSH客户端的远程登录过程?
您可以使用controlmaster指令重新使用与远程服务器的连接。
允许通过单个网络连接共享多个会话,以便在主机指令之后添加controlmaster。
设置为yes时,ssh客户端将侦听使用ControlPath参数指定的控制套接字上的连接。
这些会话将尝试重用主实例的网络连接,而不是启动新的实例,但是如果控制套接字不存在或者未在侦听,它们将恢复为正常连接。

"多路复用(Multiplexing)"是通过单条线路或者连接发送多个信号的能力。

OpenSSH可以使用多路复用来重用现有的TCP连接。

警告!这些示例需要OpenSSH 4.0或者更高版本。

设置SSH多路复用

打开~/.ssh/config文件(ssh客户端配置文件)。
如果需要系统范围的设置,请添加到/etc/ssh/ssh_config文件中:

$ vi ~/.ssh/config

追加以下代码以对所有主机重用ssh连接:

host *
    controlmaster auto
    controlpath /tmp/ssh-%r@%h:%p

其中:

  • ``controlmaster auto`:将controlmaster设置为auto
  • ``controlpath/tmp/ssh-%r @%h:%p`:指定用于连接共享的控制套接字的路径。在路径中,%h将被目标主机名替换,%p将被端口替换,%r将被远程登录用户名替换。建议用于机会连接共享的任何ControlPath至少包含%h,%p和%r。这样可以确保唯一标识共享连接。

您还可以使用以下模式匹配192.168.0.[0-9]网络范围内的任何主机:

Host 192.168.0.?
    controlmaster auto
    controlpath ~/.ssh/ssh-%r@%h:%p

对于.co.in域集合中的任何主机,请重用连接:

Host *.co.in
    controlmaster auto
    controlpath ~/.ssh/private/master-%r@%h:%p

保存并关闭文件。
现在照常连接

$ ssh [email protected]

接下来,当您再次连接时,它将使用连接套接字/tmp/[email protected]:22加快速度。
您不必输入密码或者其他任何内容。
您需要一个连接处于活动状态才能加速第二个连接。
这也适用于scp/sftp等:

$ scp /path/to/file.txt [email protected]:/tmp

比较ssh命令有无复用

您可以使用时间比较在慢速远程服务器上运行命令所花费的时间。
首先,运行时命令不进行多路复用(从~/.ssh/config文件中删除条目):

$ time ssh [email protected] /path/to/command
$ time ssh -o 'ControlMaster=no' [email protected] /bin/true

输出示例:

real	0m3.546s
user	0m0.016s
sys	0m0.008s

现在,使用多路复用运行同一命令(将条目添加到~/.ssh/config):

$ time ssh [email protected] /path/to/command
$ time ssh [email protected] /bin/ture

输出示例:

real	0m0.621s
user	0m0.006s
sys	0m0.004s

如何禁用单个ssh命令会话的多路复用?

将ControlMaster设置为no,运行以下命令:

$ ssh -o 'ControlMaster=no' [email protected]

如何找出或者检查多路复用的状态

$ ssh -O check [email protected]

输出示例:

Master running (pid=64134)

如何停止多路复用连接

要正常关闭多路复用,请将-O选项传递给ssh命令:

$ ssh -O stop Hyman@ [email protected]

输出示例:

Stop listening request sent.

传递-O exit选项来移除控制套接字并立即终止所有现有连接,运行:

$ ssh -O exit Hyman@[email protected]

输出示例:

Exit request sent.

并且您的所有ssh会话都将终止,并显示以下消息:

Shared connection to vpn.theitroad.co.in closed.

将ssh复用与ProxyCommand一起使用

您可以通过一台主机访问另一台服务器。
在此示例中,您通过vpn.theitroad.co.in到达名为10.70.203.66的内部主机:

Host internal
  HostName 10.70.203.66
  User Hyman
  ProxyCommand ssh [email protected] -W %h:%p
  ControlPath ~/.ssh/controlmasters/%r@%h:%p
  ControlMaster auto

只需执行以下命令,即可通过vpn.theitroad.co.in到达另一个名为internal的服务器:

$ ssh internal

ControlPersist选项

当ControlPersist与ControlMaster结合使用时,指定在关闭初始客户端连接后,主连接应在后台保持打开状态(等待将来的客户端连接)。
您可以如下设置:

  • ControlPersist no:主连接将不会放置在后台,并且将在关闭初始客户端连接后立即关闭。
  • ControlPersist yes:主连接将无限期保留在后台(直到通过诸如ssh -O exit user @ host选项之类的机制终止或者关闭。此外,如果设置为yes,则设置为time in秒,或者sshd_config(5)中记录的任何格式的时间,则后台的主连接在指定时间保持空闲(无客户端连接)后将自动终止,例如," ControlPersist 10m"。

这是一个更新的配置文件:

Host internal
  HostName 10.70.203.66
  User Hyman
  ProxyCommand ssh [email protected] -W %h:%p
  ControlPath ~/.ssh/controlmasters/%r@%h:%p
  ControlMaster auto
  ControlPersist yes

关于X11,ssh-agent和端口转发的说明

请注意,这些多路复用连接支持X11和ssh-agent转发,但是转发的显示和代理将属于主连接,即无法转发多个显示或者代理。
但是,您可以按以下步骤创建新会话以进行端口转发:

$ ssh -M -S /tmp/3001.port.forwording -L 3001:localhost:3001 -N -f [email protected]