vscode remote-ssh 内网穿透远程开发调试

作者:matrix 发布时间:2021 年 10 月 7 日 分类:command Linux

线上代码有时候会需要部署到内网或者防火墙后面的本地服务器环境,这个时候发布代码或者调试都会造成不便。

使用环境

测试环境为 mac vscode

windows版本的操作相差不大。

vscode作为ide编辑器,也作为文件管理工具来上传下载服务器文件。需要安装Remote - SSH插件完成这些功能。

目的

本地环境可以直接编辑操作远程服务器中的文件,当然这非常危险和忌讳!

修改文件前你需要做备份然后灾难还原 😀

路径也很清晰,通过中转来访问:

localhost -> jump -> target-service

本地电脑连接中转服务器,再通过中转服务器连接后端的target-service完成操作。

配置ssh

插件安装之后按F1键打开命令行,找到remote-ssh相关文件配置命令。
图片5271-vscode remote-ssh 内网穿透远程开发调试

或者可以直接修改~/.ssh/config文件

配置

# 中转服务器
Host jump-box
    HostName 118.X.X.11
    User root
    # IdentityFile ~/.ssh/jumpbox

# 需要连接的目标服务器 即后端的非暴露地址
# Target machine with private IP address
Host target-box
    HostName 192.168.1.11
    User root
    # IdentityFile ~/.ssh/target
    ProxyCommand ssh -q -W %h:%p jump-box

说明:
如果服务器有设置密钥登录,IdentityFile参数用于设置私钥文件地址。

连接

配置完成之后,点击左侧的remote - ssh插件的选项页面,就能看到配置的服务器。包含jump-box,target-box

图片5272-vscode remote-ssh 内网穿透远程开发调试

之后打开连接,点击右侧的文件夹📁图标打开新窗口,vscode会进行连接请求。若是密码登录请求则会让你输入密码,依次连接jump-box,target-box服务器,且最终停留在target-box服务器上,可以在线编辑操作非常方便。

vscode连接成功后,左下角会有绿色连接提示。

文件操作

和其他编辑器的基本功能都是一样,代码文件直接编辑保存,之后会自动上传到服务器。

如果想上传文件需要在vscode中找到要上传的文件或目录,点击右键复制。之后服务器的vscode窗口中点击右键粘贴。

图片5275-vscode remote-ssh 内网穿透远程开发调试

参考:

https://code.visualstudio.com/blogs/2019/10/03/remote-ssh-tips-and-tricks

http://kb.ictbanking.net/article.php?id=639

https://code.visualstudio.com/docs/remote/ssh

https://kenzoluo.github.io/2020/03/13/VScode%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E7%9A%84%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B/

https://xirikm.net/2019/619-1

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

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