服务器(容器)开发指南——SSH打洞开发

news2024/9/25 15:27:02

文章目录

  • SSH容器服务打包
    • 测试服务文件
    • 镜像打包
  • SSH打洞开发
    • 部署带SSH的容器
    • SSH连接服务器(容器内部)
      • SSH访问容器内的缺陷
    • IDE远程SSH开发
      • VSCode远程SSH开发
      • Jetbrains系列产品SSH远程开发

在进行定制化的服务开发时,我们有时候只能在固定的服务器上进行服务的开发。此时,通过命令行的方式进行开发的难度较大。我们可以考虑通过SSH打洞的方式,通过本地IDE的SSH连接功能来获取远程的环境进行代码的开发修改。
随着容器化技术的发展,越来越多的产品服务打包进容器内运行,对容器内部代码的定制化开发需求越来越多。容器本身可以简单理解为一个更轻量的虚拟机,针对容器的定制化开发的实现也可以参考服务器开发相关技术。
本文为更好的讲解SSH打洞开发的方式,采用容器化开发技术进行讲解。

SSH容器服务打包

测试服务文件

为更好的测试SSH打洞功能,特开发一个简易的Python的Flask框架脚本以供测试。
requirements.txt:

Flask==2.3.2

app.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

Flask在启动时,默认绑定127.0.0.1:5000的IP和端口。当启动容器的ports参数进行端口映射时,会将容器内绑定在0.0.0.0IP上的服务映射到主机端口上而不是容器内的127.0.0.1,所以我们在启动Flask或相关服务时,需要指定绑定host为0.0.0.0
.entrypoint.sh

cd /data

# 启动SSH服务
/etc/init.d/ssh start

# 启动Flask服务
python app.py
  • 启动SSH服务和Flask服务的顺序不能更改。直接调用python app.py会启动一个前台进程,若python app.py命令在前,其后的启动/etc/init.d/ssh start命令将不会执行。
  • 容器在启动时会执行CMDENTRYPOINT中指定的命令启动一个PID=1的守护进程,该进程负责整个容器的初始化,监控子进程运行情况,信号传输、退出容器等操作。当这个进程销毁时,整个容器也会停止运行,所以一般情况下,需要在启动的命令或脚本中启动一个一直运行的守护进程,保证PID=1的进程不会因为执行完毕而默认销毁导致容器的停止。
  • python app.py命令在这里主要就是作为守护进程的存在确保PID=1的进程不会主动销毁。
    • 以Flask程序作为守护进程固然可以很好的使容器运行起来,但是当我们在进行开发时,可能会多次重启Flask进程以测试代码,此时一旦最开始的Flask进程关闭,PID=1进程也会主动销毁,导致容器退出
    • 当容器内包含有Python服务时,我们可以通过Python自带的脚本启动一个简易的守护进程,其他服务也可以参考启动一个守护进程来代替应用程序的守护进程

优化后.entrypoint.sh

cd /data

# 启动SSH服务
/etc/init.d/ssh start

# 启动Flask服务
nohup python app.py &

# 启动python自带脚本http.server作为守护进程
python -m http.server

镜像打包

镜像打包文件

# 接收docker build参数
ARG ROOT_PASSWORD=focus

FROM python:3.8.17

# 重新声明所有参数以继承入口的参数传递
ARG ROOT_PASSWORD

COPY ./data /data

WORKDIR /data

# 安装操作系统依赖库
RUN  \
    apt update && \
    apt -y upgrade && \
    # 安装SSH
    apt -y install sudo openssh-client openssh-server sshpass && \
    pip install -r /data/requirements.txt && \
    # root免密设置
    echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
    # 设置root密码
    echo "root:${ROOT_PASSWORD:-focus}" | chpasswd && \
    # ssh配置修改
    # 允许root用户登录
    sed -i "/PermitRootLogin/c PermitRootLogin yes" /etc/ssh/sshd_config && \
    # 允许使用密码登录
    sed -i "/PasswordAuthentication/c PasswordAuthentication yes" /etc/ssh/sshd_config

CMD [ "sh", "/data/.entrypoint.sh" ]
  • 打包镜像主要是为了在容器中安装SSH相关服务,也可根据现有的镜像启动容器后在容器内安装SSH服务(需要每次新建容器后都要安装)
# 允许root用户登录
sed -i "/PermitRootLogin/c PermitRootLogin yes" /etc/ssh/sshd_config
# 允许使用密码登录
sed -i "/PasswordAuthentication/c PasswordAuthentication yes" /etc/ssh/sshd_config
  • 以上命令是实现SSH打洞登录的关键,其本质就是修改/etc/ssh/sshd_config文件中的PermitRootLoginPasswordAuthentication配置

镜像打包脚本

docker build . \
    --platform 'linux/amd64' \
    --label 'maintainer=focus<https://focus-wind.com/>' \
    --build-arg 'ROOT_PASSWORD=focus' \
    --file ./Dockerfile \
    --tag "python-ssh-tunnel:3.8.17-dev"

SSH打洞开发

部署带SSH的容器

通过上述操作,我们目前已经打包好了一个带有SSH服务的镜像,通过docker compose进行服务的部署。
compose.yaml配置文件

version: '3.8'
services:
  ssh-tunnel:
    image: python-ssh-tunnel:3.8.17-dev
    hostname: ssh-tunnel
    container_name: ssh-tunnel
    ports:
      - 8080:22
      - 5000:5000

启动容器

docker compose up -d

SSH连接服务器(容器内部)

通过端口映射,我们将容器内部的22端口映射到了本地的8080端口上。此时,如果我们需要访问容器内部的服务,可以通过指定IP为本机来访问容器内部。

ssh -p 8080 root@localhost

ssh-tunnel
如上所示,我们将容器内部的SSH的22端口映射到宿主机后,通过访问宿主机的相应端口即可进入到容器内部中。

SSH访问容器内的缺陷

通过上图SSH连接容器内部时的输出可以看到,SSH客户端在连接服务端时自动生成了SSH公钥。
SSH客户端在首次连接SSH服务端时,客户端会记录服务端返回的公钥保存在~/.ssh/known_hosts文件中,当再次进行SSH连接时客户端都会验证known_hosts文件中的公钥和服务端返回公钥是否一致。由于每次根据镜像新建的容器都是一个全新的容器,此时在进行SSH连接时,会导致返回的公钥和known_hosts文件中的公钥不一致,所以无法进行SSH连接。
若是因known_hosts导致的公钥不一致无法连接的问题,可以编辑~/.ssh/known_hosts文件,删除对应的IP公钥信息重新SSH连接即可。

IDE远程SSH开发

现有的IDE大部分都支持SSH远程开发,现在大部分都开发都是在IDE上进行的开发,IDE提供的环境能够很好的帮助我们提升开发效率。

VSCode远程SSH开发

VSCode自带有远程SSH功能,在VSCode的左侧功能栏的远程资源管理器中可以进行远程SSH操作。

  • 在VSCode的远程资源管理器中,在SSH管理栏右侧点击+按钮新建SSH连接

VSCode-SSH

  • VSCode会默认读取~/.ssh/config文件中已有的SSH配置,在~/.ssh/config文件中添加服务器SSH配置后,刷新即可在远程资源管理器中显示
Host ssh-tunnel
    HostName localhost
    User root
    Port 8080
    # %p: Port %r: User %h: HostName
    LocalCommand ssh -p %p %r:%h
  • 通过VSCode连接服务器或内部容器后即可像平常使用VSCode开发一样用VSCode进行集成开发

Jetbrains系列产品SSH远程开发

Jetbrains系统虽然产品众多,但其使用SSH远程开发的逻辑是一致的,这里以PyCharm为例介绍Jetbrains系列产品的SSH远程开发。
Jetbrains-SSH
Jetbrains-SSH-config

  • Jetbrains系列产品打开后在Remote Development的SSH中新建项目完成SSH的创建
  • Jetbrains产品可在Specify private key可选配置项中配置公钥文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/797972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

页面设计—GridRow栅格行组件

1、何时使用 在栅格布局基础上&#xff0c;一般需要通过行&#xff08;GridRow&#xff09;和列&#xff08;GridCol&#xff09;来定义信息区块的外部框架&#xff0c;以保证页面的每个区域能够稳健地排布起来。 2、如何使用 &#xff08;1&#xff09;找到GridRow组件&…

乙酰基四肽-2--------增加肌肤紧实度,重建表皮结构

简介 为了避免皮肤下垂和松弛&#xff0c;以下几种重要蛋白共同参与&#xff0c;维持皮肤结构的粘着和紧致&#xff1a;Fibulin 5亦称FBLN-5&#xff0c;是细胞外基质蛋白Fibulin家族中的最新成员。它广泛分布于富含弹性纤维的组织&#xff0c;能直接与原弹性蛋白结合&#xf…

【矩特征】图像矩特征

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 cv2.moments() 矩特征 1. 正文 (1). 空间矩 零阶矩&#xff1a;m00一阶矩&#xff1a;m10,m01二阶矩&#xff1a;m20,m11,m02三阶矩&#xff1a;m30,m…

配置Tomcat远程调试

配置Tomcat远程调试 1.Tomcat开启远程访问调试1.1 编写脚本,开启配置1.2 重启Tomcat服务 2. IDEA配置远程调试Tomcat2.1 IDEA右上角更改配置2.2 添加一个remote jvm debug2.3 进行配置2.4 配置后进行启动连接至此在本地打断点即可调试远程服务器 1.Tomcat开启远程访问调试 1.1…

Cesium:加载geojson面贴地和显示边界问题

1.背景 cesium加载geojson面数据后&#xff0c;有部分数据在地形下面显示不全&#xff0c; 加了clampToGround: true&#xff0c;设置贴地后&#xff0c;边界又不见了 this.viewer.dataSources.add(GeoJsonDataSource.load(http://xx/xzbj.geojson, {stroke: Color.BLACK.with…

questasim一个

安装好questasim后默认的波形查看界面字体很小&#xff0c;颜色看起来也不舒服&#xff0c;所以调整了一下颜色布局如下图&#xff0c;顺便记录一下波形窗口颜色大小及选中行高亮如何设置 1、波形字体颜色设置 参考如何设置一个清爽的仿真窗口&#xff08;仿真工具使用技巧&a…

vue build 打包遇到bug解决记录

文章目录 vue-cli-service servevue打包修改dist文件夹名字vue build require is not defined 和 exports is not defind 错误 vue-cli-service serve 通常vue是不能直接使用vue-cli-service命令在终端运行的&#xff0c;所以才会在package.json中配置了scripts&#xff1a; …

精选 2023 年大厂高频 Java 面试真题集锦(含答案),面试一路开挂

本文涵盖了阿里巴巴、腾讯、字节跳动、京东、华为等大厂的 Java 面试真题&#xff0c;不管你是要面试大厂还是普通的互联网公司&#xff0c;这些面试题对你肯定是有帮助的&#xff0c;毕竟大厂一定是行业的发展方向标杆&#xff0c;很多公司的面试官同样会研究大厂的面试题。 …

小程序轮播图的两种后台方式(PHP)--【浅入深出系列008】

微信目录集链接在此&#xff1a; 详细解析黑马微信小程序视频–【思维导图知识范围】难度★✰✰✰✰ 不会导入/打开小程序的看这里&#xff1a;参考 让别人的小程序长成自己的样子-更换window上下颜色–【浅入深出系列001】 文章目录 本系列校训学习资源的选择啥是轮播图轮播…

基于Android系统的外卖APP【纯干货分享,免费领源码04871】

摘要 立足于当下餐饮行业现有的点餐模式&#xff0c;分析传统APP点餐的运作流程&#xff0c;结合Android系统的特点设计新型的外卖APP。近几年&#xff0c;人们生活水平日益提升&#xff0c;但工作强度和压力不断增强&#xff0c;尤其是对于上班族而言&#xff0c;到餐厅吃饭费…

C++实现通用进制转换

C实现通用进制转换 #include <iostream> #include <string> #include <algorithm> #include <sstream> using namespace std; // 将一个字符转换为对应的数字 int charToNum(char c) { if (c > 0 && c < 9)return c - 0; el…

四旋翼无人机使用教程

文章目录 前言一、检查遥控器电源开关混控拨码开关微调开关飞行模式刹车开关行程开关接收机对码 二、检查飞机检查接线 三、解锁并飞行 前言 PX4固件 QGC地面站 Pixhwak飞控 Mc6c遥控器 开源飞控博大精深&#xff0c;欢迎广大爱好者加博主微信名片&#xff0c;一起学习交流。…

Windows版filehub安装教程

一个基于Github开发的文件存储软件&#xff0c;美其名曰&#xff1a;FileHub&#xff0c;可存万物&#xff0c;而且绝不和谐任何文件。类似于百度云盘的功能&#xff0c;但是功能上肯定达不到百度云盘的效果&#xff0c;但是基本功能还是有的&#xff1a;例如登录注册&#xff…

C语言每天一练:输出杨辉三角

题目&#xff1a;请输出以下杨辉三角(要求输出前10行) 列&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ...... 题解析&#xff1a;不了解杨辉三角的可以百度看一下&#xff0c;大概是这样的&#xff0c;咱们就可以解…

日撸代码300行:第55天(基于 M-distance 的推荐 (续))

代码来自闵老师”日撸 Java 三百行&#xff08;51-60天&#xff09;“&#xff0c;链接&#xff1a;https://blog.csdn.net/minfanphd/article/details/116975957 工作承接第54天的基于M-distance 的推荐&#xff0c;目标是自己实现一下user-based recommendation。原博客中的…

NLP实验案例100个(6-10)

实验六 数据类型 一、实验目的及要求 熟悉数据的数据类型二、实验设备&#xff08;环境&#xff09;及要求 开发环境&#xff1a;jupyter notebook 开发语言以及相关的库&#xff1a;python开发语言 numpy库 三、实验内容与步骤 1.创建一个array类型的数据&#xff0c;设置…

【ShaderToy中图形效果转译到UnityShaderlab案例分享,纯代码实现卡通心跳_Pattern】

Shader"ShaderToy/Pattern" {Properties{_MainTex("_MainTex", 2D) = "white"{}}SubShader{Pass{CGPROGRAM

性能如何通过分析后台资源确定瓶颈之CPU内存

确定瓶颈之CPU、内存 影响性能的因素 CPU 内存 网络 硬件 i/o 中间件 应用服务器 数据库 家门口的路比较拥堵&#xff1a;解决方案---多来几条路/加宽路/修地铁/修个桥、修整路面、找交警指挥交通/红绿灯、限行、分散周围居民、收费、其他路段的问题 CPU--中央处理器--…

使用go与智能合约交互之函数选择器调用

go与智能合约交互的方式有很多种&#xff0c;其中一种方式可以在不知道合约源码的情况下进行调用&#xff0c;接下来让我们一起学习一下。 1、首先我们安装一下go-ethereum go get -u github.com/ethereum/go-ethereum2、新建main.go文件&#xff0c;添加依赖 import ("…

KEIL 软件学习魔法棒

Device 芯片选型 Target : 晶振设置 Output: 选择中间文件的生成路径 Objects (创建文件夹之后再选择) &#xff0c;创建hex文件 Listing : 创建文件夹之后再选择 USER&#xff1a;改变生成的 hex 文件路径 C/C &#xff1a;宏定义 和 路径选择 &#xff08;目前使用到的&#…