ssh隧道解决pycharm跨过跳板机连接服务器问题

学校提供的服务器仅能通过内网访问,但也提供了一个跳板机,可以先通过ssh到跳板机再从跳板机ssh到内网服务器。但在连接pycharm的时候却出现了问题。因此本文解释如何通过ssh隧道方式,用pycharm通过跳板机连接到内网服务器


修改本地与跳板机的ssh配置

在本地和跳板机上分别作如下操作

vim ~/.ssh/config

在config文件中添加以下内容

Host *
    ControlPersist yes
    ControlMaster auto
    ControlPath ~/.ssh/%n:%p

设置ssh隧道

在本地命令行输入以下命令

ssh -N -f -L 6000:<内网服务器ip>:22 -p <跳板机端口> username@<跳板机ip> -o TCPKeepAlive=yes

上述命令各个参数的含义如下:

  • N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
  • f 告诉SSH客户端在后台运行
  • L 做本地映射端口
  • 关于SSH建立管道隧道

此时,登录本地的6000端口就相当于登录内网服务器了。

ssh -p 6000 服务器用户名@localhost

配置pycharm(mac系统为例)

  1. 点击Preference >> Project Interepreter
  2. 点击右边的小齿轮,进入设置,点击加号➕添加
  3. 选择ssh Interpreter
  4. ssh隧道解决pycharm跨过跳板机连接服务器问题_第1张图片
  5. 设置host 和 port 和Username
Host: 127.0.0.1
Port: 6000
  1. 设置好mapping

(可选)使用corn 定时维护ssh 隧道

SSH 隧道可能因为网络不稳定而断开,每次断开之后都需要手动再次建立SSH 隧道。下面介绍一种解决方案,通过cron定期执行脚本来维护SSH隧道畅通

  1. 编写脚本,通过判断socket文件是否存在来判断隧道连接是否已经断开
    在本地任意位置创建脚本auto_connect.sh并写入如下内容(注意更换<>中内容)

    #/usr/bin/env sh
    if [[ ! -a "~/.ssh/<跳板机ip>:<跳板机端口>" ]]; then
        echo "connecting <跳板机ip>:<跳板机端口> .."
        ssh -N -f -L 6000:<内网服务器ip>:22 -p <跳板机端口> username@<跳板机ip> -o TCPKeepAlive=yes
        if [[ $? -ne 0 ]]; then
            echo "failed to connect <跳板机ip>:<跳板机端口>" >&1
            exit 2
        fi
    fi
    
  2. 使用cron服务定时执行脚本建立ssh 隧道。在命令行中执行如下语句:(注意修改脚本位置, 路径不可用缩写)

    echo "0-59   *   *   *   *   sh /path/to/auto_connect.sh" > ~/.crontab
    crontab ~/.crontab
    

你可能感兴趣的:(ssh,pycharm)