item2免密登录和保持连接

在/usr/local/bin/ 目录下,名称自取。如fastssh.sh。修改其中的USER和PW变量

#!/usr/bin/expect
 
set timeout -1
 
### prepare the variable
 
set USER "your_username"
set PW "your_password"
set JUMPER_SERVER [lindex $argv 0]
set SYSTEM_ENV [lindex $argv 1]
set LOG_SERVER [lindex $argv 2]
set USE_MASTER_SESSION 0
 
### login the jump server
spawn ssh $USER@$JUMPER_SERVER
expect {
    "]"
    {
        # already login
        send_user "************already login relay*************\n"
        set USE_MASTER_SESSION 1
    }
    "(yes/no)?"
    {send "yes\n"; exp_continue}
    "Password:"
    {
        send_user "\nEnter your token: "
    expect_user -re "(.*)\n"
    set TOKEN  "$expect_out(1,string)"
        #get the token from user
        send "$PW$TOKEN\n"
    }
}
### reconnect other
if { "$USE_MASTER_SESSION" == 1 } {
    send "exit\n"
    expect "select other devices" { send "\r" }
}
 
expect {
    "Please select system:"
    {send "$SYSTEM_ENV\n";exp_continue}
    "Please select device:"
    {send "1\n";exp_continue}
    "Please select login account:"
    {send "3\n";exp_continue}
    "*Last login*"
    {send_user "************login relay success***********\n"}
}
if { "$LOG_SERVER" == "" } {
    ### send_user "************no server to login*************\n"
} else {
    ### send_user "************login server $LOG_SERVER*************\n"
    send "ssh $LOG_SERVER\n"
}
 
interact

或者下面写一个脚本,配置到 iTerm2 的 Profiles 里(当然放在其他地方也可以)。脚本内容如下:

#!/usr/bin/expect -f
set user root
set host 192.168.1.110
set password 123456
set timeout -1
spawn ssh $user@$host
expect "*assw
ord:*"
send "$password\r"
interact
expect eof

iterm2->preferences。切换到Profile,点击下面的“+”。新建。

image.png

Command 里填入 fastssh.sh hostname ...

保持连接不断

vim ~/.ssh/config,然后新增

Host *
    ServerAliveInterval 60

我觉得60秒就好了,而且基本去连的机器都保持,所以配置了*,如果有需要针对某个机器,可以自行配置为需要的serverHostName。

ssh -o ServerAliveInterval=30 user@host

为啥连接会断

既然ssh是空闲过久导致连接超时而断开,那么「ssh默认是多久时间,会自动断开连接?」

本以为是ssh自动断开超时连接的,但通过配置看到,默认值中并没有做任何限制,那么理论上,ssh的连接是不会断开的。那到底是谁,干了这件「坏事」?

问题就可能出现在一下这几个部分

1. 服务器存在防火墙,会关闭超时空闲连接,或设置了关闭超时空闲连接。
2. 客服端和服务器之间存在路由器,路由器也可能带有防火墙,会关闭超时空闲连接。
3. 客服端存在防火墙,会关闭超时空闲连接。

原来,问题出在防火墙!!

NAT防火墙喜欢对空闲的会话进行超时处理,以确保它们状态表的干净和内存的低占用率。一些防火墙比较友好,允许你的空闲会话时间为一天甚至超过一天;另一些却如盖世太保,5分钟空闲就终止你的会话。通过ssh连接后,客户端和服务端长时间没响应时,在两方机器设置中均没任何限制,但在各自的防火墙,或是中转网络连接路由的防火墙中,出现了「闲置超时断开」的缺省机制!

解决

修改服务端配置

TCPKeepAlive yes #表示TCP保持连接不断开
ClientAliveInterval 300 #指定服务端向客户端请求消息的时间间隔,单位是秒,默认是0,不发送。设置个300表示5分钟发送一次(注意,这里是服务端主动发起),然后等待客户端响应,成功,则保持连接。
ClientAliveCountMax 3 #指服务端发出请求后客户端无响应则自动断开的最大次数。使用默认给的3即可。

最后要重启sshd服务才生效
sudo /etc/init.d/ssh restart
修改服务端的配置往往会比较麻烦,也涉及到权限问题,以及安全问题

修改客户端配置

vim ~/.ssh/config

Host *
    ServerAliveInterval 60

Host * #表示需要启用该规则的服务端(域名或ip)
ServerAliveInterval 60 #表示没60秒去给服务端发起一次请求消息(这个设置好就行了)
ServerAliveCountMax 3 #表示最大连续尝试连接次数(这个基本不用设置)

你可能感兴趣的:(item2免密登录和保持连接)