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

这篇具有很好参考价值的文章主要介绍了服务器(容器)开发指南——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打洞开发,docker,Python,服务器,ssh,运维
如上所示,我们将容器内部的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连接

服务器(容器)开发指南——SSH打洞开发,docker,Python,服务器,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远程开发。
服务器(容器)开发指南——SSH打洞开发,docker,Python,服务器,ssh,运维
服务器(容器)开发指南——SSH打洞开发,docker,Python,服务器,ssh,运维文章来源地址https://www.toymoban.com/news/detail-609982.html

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

到了这里,关于服务器(容器)开发指南——SSH打洞开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 两台服务器上的两个docker容器之间配置ssh免密登录

    因为要在两台服务器的容器上使用ucx实现GPU的RDMA,所以需要两个容器之间ssh免密登录 步骤如下(所有步骤均在容器内部进行) 切换成root用户 在容器内部安装openssh: # apt-get install openssh-client openssh-server 编辑ssh的配置文件,更改ssh的端口: # vim /etc/ssh/sshd_config 在最后一行加

    2024年03月13日
    浏览(56)
  • Windows 系统下:SSH 远程连接 Linux 服务器的完整指南

    以下是使用 Windows 系统的 SSH 远程连接 Linux 服务器的详细操作步骤,(我们以 Ubuntu 和CentOS 为例) 1. 确保 Linux 服务器已启用 SSH 首先,确保您的 Linux 服务器上已经安装并运行了 SSH 服务。对于大多数 Linux 发行版, OpenSSH 是默认的 SSH 服务器。您可以使用以下命令来安装它:  

    2024年02月08日
    浏览(75)
  • (一)ssh远程连接服务器GPU以及其他GPU使用途径——新手指南

    最近在训练语义分割网络时决定使用GPU,本文记录新手在使用GPU时遇到的一些坑。想要在win10系统上配置GPU运行Pytorch代码可以考虑以下几种方式: 安装cuda,以及GPU版本的pytorch和torchvision,使用电脑自带的GPU进行网络训练; 远程连接实验室的服务器,通过IP、账号以及密码进

    2024年02月08日
    浏览(48)
  • Windows服务器管理技巧:多用户登录设置、开启防火墙与SSH远程登录配置指南

    WindowsServer服务器管理技巧:对于使用WindowsServer服务器开发人员或者运维人员初学者来说,可能会遇到很多问题,比如:如何设置允许多用户同时登录服务器?如何开启服务器防火墙?Windows如何配置SSH远程登录?等等,如果遇到了这些问题,来看看这篇文章就能解决啦! 如果

    2024年02月13日
    浏览(53)
  • 【SSH】在VScode远程开发 使用SSH远程连接服务器

    转发自cpolar极点云的文章:【Vscode远程开发】使用SSH远程连接服务器 「内网穿透」 远程连接服务器工具有很多,比如XShell、putty等,可以通过ssh来远程连接服务器,但这用于写代码并不方便,可能需要现在本地写好代码后再将源代码传送到服务器运行、服务器上的图片也无法

    2024年02月08日
    浏览(52)
  • 使用libssh2建立安全的SSH连接:C++开发者的综合指南

    SSH和安全连接的重要性是不可忽视的。在今天的互联网环境中,保护敏感数据和网络通信的安全至关重要。 通过使用SSH建立安全连接,可以确保数据在传输过程中是加密的。这意味着即使在网络上拦截到数据包,攻击者也无法读取其内容。 SSH提供了多种身份验证方法,如密

    2024年02月04日
    浏览(51)
  • 使用VSCode SSH公网远程连接本地服务器开发

    转发自cpolar极点云的文章:【Vscode远程开发】使用SSH远程连接服务器 「内网穿透」 远程连接服务器工具有很多,比如XShell、putty等,可以通过ssh来远程连接服务器,但这用于写代码并不方便,可能需要现在本地写好代码后再将源代码传送到服务器运行、服务器上的图片也无法

    2024年02月16日
    浏览(55)
  • VSCode使用Remote SSH远程连接Linux服务器【远程开发】

    转发自CSDN远程穿透的文章:【vscode远程开发】使用SSH远程连接服务器 「内网穿透」 远程连接服务器工具有很多,比如XShell、putty等,可以通过ssh来远程连接服务器,但这用于写代码并不方便,可能需要现在本地写好代码后再将源代码传送到服务器运行、服务器上的图片也无

    2023年04月21日
    浏览(62)
  • 「远程开发」VSCode使用SSH远程linux服务器 - 公网远程连接

    转发自cpolar内网穿透的文章:【Vscode远程开发】使用SSH远程连接服务器 「内网穿透」 远程连接服务器工具有很多,比如XShell、putty等,可以通过ssh来远程连接服务器,但这用于写代码并不方便,可能需要现在本地写好代码后再将源代码传送到服务器运行、服务器上的图片也无

    2024年02月06日
    浏览(60)
  • 如何设置IDEA远程连接服务器开发环境并结合cpolar实现ssh远程开发

    本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接,然后实现远程Linux环境进行开发。 IDEA的远程开发功能,可以将本地的编译、构建、调试、运行等工作都放在远程服务器上执行,而本地仅运行客户端软件进行常规的开发

    2024年04月09日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包