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 | host * |
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"}
}
interactafter
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