当前位置: 首页 > news >正文

【开发便利】让远程Linux服务器能够访问内网git仓库

打通网络壁垒:本地Windows直连内网Git的远程开发终极指南

场景痛点

开发主力是一台云端的 Linux 服务器,代码却存放在无法被公网访问的公司内网 Git 仓库中。

本文利用 Windows 电脑作为“网络桥梁”,搭建一条能自动重连的 SSH 隧道,解决远程开发中的网络隔离问题。

核心思路

利用 Windows 电脑作为跳板,建立一个从它到远程 Linux 服务器的反向 SSH 隧道。当远程服务器访问自己的某个端口时,流量会被加密传输回你的 Windows 电脑,再由你的电脑转发至内网的 Git 服务器,从而打通网络壁垒。

数据流向
[远程Linux服务器] -> [SSH隧道] -> [你的Windows电脑] -> [公司内网Git服务器]


1. 配置SSH密钥

1.1 在本地 Windows 电脑上生成 SSH 密钥

打开 PowerShell,执行以下命令。如果 C:\Users\你的用户名\.ssh\ 目录下已有 id_rsaid_rsa.pub 文件,可跳过此步。

# -N "" 表示创建一个没有密码的密钥,这对于自动化脚本至关重要
ssh-keygen -t rsa -b 4096 -N "" -f C:\Users\[你的用户名]\.ssh\id_rsa
  • 这会生成一个没有密码的私钥 (id_rsa) 和公钥 (id_rsa.pub)。
1.2 在远程 Linux 服务器上生成 SSH 密钥

登录你的远程 Linux 服务器,执行相同操作。如果 /root/.ssh/ (或 ~/.ssh/) 目录下已有密钥,可跳过。

# -N "" 创建一个没有密码的密钥
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
1.3 【关键】将公钥添加到内网 Git 平台
  1. 添加你的 Windows 电脑公钥

    • 在 Windows PowerShell 中,获取公钥内容:cat C:\Users\[你的用户名]\.ssh\id_rsa.pub
    • 复制输出的全部内容。
    • 登录你的内网 Git 平台(如 GitLab, Gitea, Gogs),进入 “个人设置” -> “SSH 密钥” 页面,将复制的公钥添加进去。
  2. 添加你的远程 Linux 服务器公钥

    • 在远程 Linux 服务器上,获取公钥内容:cat ~/.ssh/id_rsa.pub
    • 复制输出内容,用同样的方式,将其也添加到内网 Git 平台的 SSH 密钥列表中。

:为何要添加两个公钥?我们最终的隧道方案会让认证请求回退到 Windows 电脑来处理,因此 Windows 的公钥是必须的。但为了覆盖所有情况并确保 git 命令在服务器上总能找到一个有效的身份,将服务器自身的公钥也添加进去是最为稳妥的做法。


2. 从 Windows 免密登录远程服务器

为了让我们的隧道脚本能自动运行,必须让 Windows 电脑能无需密码地登录到远程 Linux 服务器。

  1. Windows PowerShell 中,使用 ssh-copy-id 命令将你的 Windows 公钥 传送到远程服务器。

    # 将 user 和 110.40.228.116 替换为你的实际信息
    ssh-copy-id root@110.40.218.106
    
    • 这个过程会要求你输入一次远程服务器的登录密码。
  2. 测试免密登录。完成后,尝试再次登录,如果直接进入服务器而没有提示输入密码,则配置成功。

    ssh root@110.40.228.116
    

测试
windows执行命令:

# 命令格式: ssh -fN -A -R <远程监听端口>:<目标内网IP>:<目标内网端口> <user>@<远程服务器IP>
ssh -fN -A -R 2222:192.168.222.54:22 user@110.40.218.106

然后登录远程服务器,使用git clone一个仓库,测试是否连通。

 git clone ssh://git@localhost:2222/仓库名.git

如果成功则正确

3. 创建轻量级持久化隧道

我们将使用一个“批处理脚本 + VBS启动器”的组合,实现一个无需安装任何软件、双击即可在后台运行、且能自动重连的 SSH 隧道。

3.1 编写“连接与重连”脚本 (start_tunnel.bat)

在你的 Windows 电脑上(例如桌面)创建一个名为 start_tunnel.bat 的文件,内容如下:

@echo off
rem 设置窗口标题,方便在任务管理器中识别
title SSH Tunnel Connector:loop
echo [%time%] 启动SSH隧道连接...
rem --- 核心SSH命令,请确保-i后面的密钥路径正确 ---
ssh.exe -N -i "C:\Users\[你的用户名]\.ssh\id_rsa" -R 2222:192.168.222.54:22 root@110.40.218.106 -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -o ExitOnForwardFailure=yesecho [%time%] SSH连接已断开,将在10秒后重连...
rem 等待10秒,防止因连接问题过于频繁地重试
timeout /t 10 /nobreakgoto loop
  • 【必须修改】: 将 C:\Users\[你的用户名]\.ssh\id_rsa 替换为第一步中你 Windows 电脑私钥的准确路径
  • 【必须修改】: 将 192.168.222.54 替换为你内网 Git 服务器的 IP 地址
  • 【必须修改】: 将 root@110.40.218.106 替换为你远程 Linux 服务器的用户名和 IP 地址
3.2 编写“后台隐藏运行”启动器 (run_in_background.vbs)

在与 start_tunnel.bat 相同的文件夹里,再创建一个名为 run_in_background.vbs 的文件,内容如下:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "C:\Users\[你的用户名]\Desktop\start_tunnel.bat", 0, False
  • 【必须修改】: 将 C:\Users\[你的用户名]\Desktop\start_tunnel.bat 替换为你上一步创建的 start_tunnel.bat 文件的绝对完整路径
3.3 使用隧道
  • 启动:双击 run_in_background.vbs 文件。隧道将在后台无窗口运行。
  • 停止:打开任务管理器 (Ctrl+Shift+Esc) -> “详细信息”,结束 ssh.exe 进程。

4. 远程开发 - 在服务器上配置 Git

隧道已经联通,现在我们可以在远程服务器上享受开发的乐趣了。

  1. 通过你喜欢的方式(VSCode Remote, JetBrains Gateway, …)连接到你的远程 Linux 服务器。
  2. 打开服务器的终端。
4.1 克隆新仓库

使用 localhost 和隧道端口 2222 来代替内网 Git 服务器的 IP 地址。

# 原命令: git clone git@192.168.222.54:path/to/repo.git
# 新命令:
git clone ssh://git@localhost:2222/path/to/repo.git
  • 注意:协议头 git@ 换成了 ssh://git@,IP 地址后的冒号 : 换成了斜杠 /git 是你在 Git 平台上的用户名。

最后,加班写博客的我祝大家编码愉快!

或者可以使用autossh实现链接的稳定,这个比简单的脚本更好。
可以参考:https://wzx046.github.io/post/70/

http://www.dtcms.com/a/354151.html

相关文章:

  • 目标检测基础
  • [系统架构设计师]论文(二十三)
  • 控制系统仿真之时域分析(二)
  • 计算机组成原理(13) 第二章 - DRAM SRAM SDRAM ROM
  • 通信原理(005)——带宽、宽带、传输速率、流量
  • 农业物联网:科技赋能现代农业新篇章
  • uC/OS-III 队列相关接口
  • Linux 命令浏览文件内容
  • 机器视觉的车载触摸屏玻璃盖板贴合应用
  • 【Bluetooth】【调试工具篇】第九章 实时抓取工具 btsnoop
  • [vcpkg] Windows入门使用介绍
  • 致远OA新闻公告讨论调查信息查询SQL
  • 模拟电路中什么时候适合使用电流传递信号,什么时候合适使用电压传递信号
  • 世界的接口:数学、心智与未知的协作
  • 【前端】jsmpeg 介绍及使用
  • Libvio 访问异常排查指南:从现象到根源的深度剖析
  • 专项智能练习(关系数据库)
  • 风锐统计——让数据像风一样自由!(九)——回归分析
  • FreeRTOS内部机制理解(任务调度机制)(三)
  • opencv学习笔记
  • 基于 Docker Compose 的若依多服务一键部署java项目实践
  • 【深度学习-Day 44】GRU详解:LSTM的优雅继任者?门控循环单元原理与PyTorch实战
  • sparksql的transform如何使用
  • 8.27 网格memo
  • HTTP 头
  • Go 1.25新特性之容器感知功能详解
  • 【C++语法篇】:函数
  • 超越ChatBI!深度解析衡石HENGSHI SENSE 6.0如何实现全流程AI赋能
  • 第二阶段WinFrom-7:文件操作补充,泛型复习,协变和逆变
  • Python LangChain RAG从入门到项目实战09.:LangChain 中的 Retriever(检索器)