autossh自动输入密码且断线重连

作者:matrix 发布时间:2020-10-28 分类:command Linux

mac上使用ssh命令隧道转发访问内网会出现经常断连的情况,每次都需要重启窗口执行命令,没有windows上xshell上隧道设置来的简单好用。当然,后面我发现Termius.app支持端口转发后,依然觉得autossh的方式香~

换用autossh来代替ssh,只需要添加-M参数用于设定监听的本地端口,本地不被占用的都可以。

autossh安装

autossh就用来解决断线重连的问题。

测试环境为macos

autossh安装:brew install autossh

要自动免密码登录目前知道两个方法:

方法1 密钥登录

无密码密钥登录,配合autossh可以稳定使用。

方法2 autossh+expect

这里主要介绍自动输入密码的方式,可以解决各种场景的问题。

使用autossh+expect的方式用脚本操作,支持ssh登录密码、密钥密码都可配置输入,所以这个是真正能解决很多自动化处理的问题。

autossh.sh文件

#!/bin/bash
# macos下测试使用
# 执行之后在窗口中ctrl+c终止连接进程

PASS='XXXXX' #ssh登录密码
CMD=$@
BASE_CMD='/usr/local/bin/autossh' # autossh 执行路径
trap 'ps aux|grep "$BASE_CMD $CMD" |grep -v grep | awk "{print \$2}" | xargs kill &>/dev/null && echo "stop done.\n"' 2 # ctrl + c 按键后执行命令终止子进程

VAR=$(expect -c "
spawn $BASE_CMD $CMD
match_max 100000;

while (1) {
    # 匹配关键字password,之后发送密码
    expect \"*?password:*\" {send -- \"$PASS\r\"}

    # 下面的方式执行失败
    #set connectedFlag 0;
    # set timeout 60;
    # expect {
    #     '?sh: Error*'
    #         { puts 'CONNECTION_ERROR'; exit; }
    #     '*yes/no*'
    #         { send 'yes\r'; exp_continue; }
    #     '*?assword:*' {
    #          # send '$PASS\r'; set timeout 4;
    #          send -- \"$PASS\r\"
    #          expect '*?assword:*' { puts 'WRONG_PASSWORD'; exit; }
    #          set connectedFlag 1;
    #     }
    #     # if no password
    #     '*~*'
    #         { send 'echo hello\r'; set connectedFlag 1; }
    # }
}

")
echo "==============="
echo "$VAR"

tail -f /dev/null # 前台挂起主进程

注意:

密码中出现脚本元字符$需要转义处理\$

如果ssh命令指定密钥登录提示输入密码passphrase,一样的操作需要匹配关键字passphrase然后发送密码和回车符即可。

脚本中自动输入密码的实现方式也有其他,比如sshpass

使用

bash ./autossh.sh -M 1234  -p 22 -L 127.0.0.1:8088:182.18.1.2:8088 root@SERVER_HOST

说明:

-M 1234 :autossh的参数用于监听ssh是否断线。如果启动多个隧道命令,此端口不能重复使用,随意更换即可。

127.0.0.1:8088:182.18.1.2:8088,连接服务器后将服务器182.18.1.2:8088转发到本地127.0.0.1:8088

ctrl + c 按键终止

参考:

http://www.ouvps.com/?p=790

http://www.ouvps.com/?p=792

autossh参数参考:
http://www.freeoa.net/osuport/netmanage/autossh-useage-refer_2831.html

http://www.freeoa.net/osuport/netmanage/ssh-automatic-login-config_285.html

https://cloud.tencent.com/developer/ask/89349

https://blog.csdn.net/csdn_changsha/article/details/103631673

https://blog.mimvp.com/article/10072.html

https://www.cnblogs.com/hongdada/p/13711688.html