mac上使用ssh命令隧道转发访问内网会出现经常断连的情况,每次都需要重启窗口执行命令,没有windows上xshell上隧道设置来的简单好用。当然,后面我发现Termius.app支持端口转发后,依然觉得autossh的方式香~
换用autossh来代替ssh,只需要添加-M参数用于设定监听的本地端口,本地不被占用的都可以。
autossh安装
autossh就用来解决断线重连的问题。
测试环境为macos
autossh安装:
要自动免密码登录目前知道两个方法:
方法1 密钥登录
无密码密钥登录,配合autossh可以稳定使用。
方法2 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,一样的操作需要匹配关键字然后发送密码和回车符即可。
脚本中自动输入密码的实现方式也有其他,比如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 按键终止
参考:
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://www.cnblogs.com/hongdada/p/13711688.html