ssh-ControlMaster

ssh 的配置文件~/.ssh/config可以大大的简化 ssh 的一些操作,如果没有这个文件则自己在 ~/.ssh/touch一个即可

该文主要介绍使用 ControlMaster 来复用连接,每次ssh一台服务器时不需要每次输入密码

配置参数

ControlMaster

SSH支持 ControlMaster 模式,单一网络共享多个seesion,复用之前建立的连接,

值可以为 no(default)/yes/ask/auto需要和 ControlPath 配合使用,当值为 yes 时,ssh 会监听该路径下的 control socket,多个 session 会去连接该 socket,则会尽可能的复用连接

ControlPath

指定 control socket 的路径

值可以使用下面这些参数:

  • %L 本地主机名的第一个组件
  • %l 本地主机名(包括域名)
  • %h 远程主机名(命令行输入)
  • %n 远程原始主机名
  • %p 远程主机端口
  • %r 远程登录用户名
  • %u 本地 ssh 正在使用的用户名
  • %i 本地 ssh 正在使用 uid
  • %C 值为 %l%h%p%r 的 hash

ControlPersist

结合 ControlMaster 使用,指定连接打开后后台保持的时间。值可以为 no/yes/整数,单位 s。如果为 no,最初的客户端关闭就关闭。如果 yes/0,无限期的,直到杀死或通过其它机制,如:ssh -O exit

实际配置

~/.ssh/config文件

1
2
3
4
host *
ControlPersist yes
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
  • host 标识匹配的主机名,*代表所有,也可匹配的主机
  • ControlPersist 保持连接,客户端关闭并不会真的关闭连接
  • ControlMaster 开启连接复用
  • ControlPath 指定control socket的路径,当开启ssh连接后,会在~/.ssh/下产生一个master开头的文件,当有这这个文件时,再次ssh连接同一个服务器时判断有该文件则不需要输入密码

修改expect脚本

经常会使用expect脚本来连接服务器,开启ControlMaster模式后可能会使之前的expect脚本有问题,所以需要修改expect脚本

  • before

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/expect
    set host [lindex $argv 0]
    set username ""

    spawn ssh $username@$host
    expect {
    "*yes/no)? " {send "yes\n"; exp_continue}
    "password:" {send "password"}
    }
    interact
  • after

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/expect
    set host [lindex $argv 0]
    set username ""

    set controlMaster [file exists ~/.ssh/master-$username@$host:22]

    if { $controlMaster} {
    spawn ssh $username@$host
    } else {
    spawn ssh $username@$host
    expect {
    "*yes/no)? " {send "yes\n"; exp_continue}
    "password:" {send "password"}
    }
    }
    interact
分享到: