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 按键终止

参考:

Linux autossh 实现SSH 密码自动输入,自动登录的方法

转:expect脚本实现autossh自动输入密码 ssh自动登录

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

ssh + sshpass 自动输入密码登录服务器

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

ssh config多账户/多域名配置

作者:matrix 发布时间:2019年6月18日 分类:Linux

测试环境:ubuntu

客户端连接远程ssh/git服务的时候可以在本地配置SSH config,用于简化多参数使用操作或者修改默认的ssh命令使用的配置。

我这里需要使用gitee的ssh密钥来管理远程仓库代码,方便以后可以免密码提交/更新代码。然而本地已经存在一个~/.ssh/id_rsa私钥,且还设置了用来保护私钥的passphrase密码。如果用之前的私钥连接gitee会造成每次都要求输入passphrase密码,亦或不能单独区分使用。
这个问题可以使用配置文件~/.ssh/config来解决

新建新的密钥对

$ ssh-keygen -t rsa -C "user"

新建的时候设置新密钥的保存路径,避免把之前的覆盖掉

配置

config文件默认是不存在的,直接新建即可

$ vi ~/.ssh/config

使用下面配置:

# gitee账户
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rrsa_gitee

说明:
Host类型昵称,可以简化登录的输入地址,比如Host ccl,则可以用ssh ccl直接连接
HostName表示连接的远程主机地址
IdentityFile表示指定私钥文件路径
还有其他参数
Port指定端口
User指定用户名

这种配置可以让ssh来根据远程host地址来使用不同的私钥,设置了User还可以让ssh工具不同用户名来读取配置,也可以使用相同host地址哟~

比如都是github的不同账户,类似配置:

Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user1_rsa
User user1


Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user2_rsa
User user2

参考:
https://gitee.com/help/articles/4229
http://vra.github.io/2017/07/09/ssh-config/
https://gitee.com/help/articles/4181
https://daemon369.github.io/ssh/2015/03/21/using-ssh-config-file

PEACE~

ssh/git pull 无密码登录 自动拉取

作者:matrix 发布时间:2019年5月28日 分类:Linux

测试需要S,C两台服务器,我需要C服务器ssh登录到S服务器进行操作。
目的:服务器C端使用命令git pull无密码登录自动从服务器S拉取最新代码。

客户端生成RSA密钥

服务器C属于客户端角色,需要生成本地服务器的rsa密钥对,然后价格公钥发送到服务器S。
登录服务器C

$ cd ~
$ ssh-keygen -t rsa
#后面就默认回车

默认会在 ~/.ssh中生成id_rsa.pub,id_rsa这两个密钥对。

发送公钥

我之前是手动尝试把公钥文本打来粘贴到服务器S,然而ssh登录的话还是要密码验证。测试发现最好是使用ssh-copy-id命令进行操作。
还是在服务器C进行操作

$ ssh-copy-id -i ~/.ssh/id_rsa.pub login_user@HOST -p 22

说明:
ssh-copy-id命令可以快速的将公钥复制到远程主机
-i 指定公钥路径
login_user 为登录的用户名
HOST 为登录的远程服务器S的地址,域名/IP均可
-p 指定服务器S的ssh端口号

命令输入后应该会让你输入login_user用户的密码,若出现and check to make sure that only the key(s) you wanted were added.则表示公钥应该添加成功。
以免出现问题,现在可以去服务器S端看看,指定用户名login_user的文件/home/login_user/.ssh/authorized_keys会有客户端的rsa公钥。

登录测试

在服务器C操作
测试登录:

ssh login_user@HOST -p 22

若登录成功 BINGO!

其他问题

如出现还是需要密码的情况:

1.需要确定/etc/ssh/sshd_config配置文件中是否允许RSAAuthentication

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

2.用户目录权限问题

.ssh父目录的权限是755(我的是/root),.ssh目录权限是700,authorized_keys文件 600

3.确保仓库地址是ssh地址
如果还是https的话就用git remote set-url origin命令修改下:

$ git remote set-url origin git@HOST:user/project.git

参考:
https://blog.csdn.net/alifrank/article/details/48241699
https://blog.csdn.net/chengyuqiang/article/details/78432675
https://blog.csdn.net/b_x_p/article/details/78534423
https://www.cnblogs.com/0xcafebabe/p/5234678.html