首页 > 其他分享 >Shifu高级功能:命令行中间件之HTTP 到 SSH 的中间件

Shifu高级功能:命令行中间件之HTTP 到 SSH 的中间件

时间:2023-03-15 19:32:04浏览次数:54  
标签:body HTTP Shifu 中间件 bytes SSH 8.8

介绍

为了使Shifu可以整合开发者的驱动,我们编写了一个简单的 HTTP 到 SSH 的中间件来供开发者使用

设计

这个 HTTP 到 SSH 的中间件设计如下:

  • 从中间件利用容器提供的公钥建立一个到容器的 SSH 连接
  • 这个 SSH 连接会被用作反向 HTTP 代理,代理到 localhost 的制定 HTTP 端口
  • 这个中间件会直接在 SSH 的会话中执行 HTTP 请求的 body 的内容
  • 中间件会将执行内容的结果以及状态代理回复给请求者

功能

代理 HTTP body 的内容到 SSH shell 并执行

中间件的主要功能就是将任意HTTP 请求中 body 的内容附加一个超时并执行

举例:

当使用curl去 Post 一个请求到制定 URL, 会是如下命令:

curl -X POST -d "ping 8.8.8.8" http://example.com

这个请求会被中间件传递到驱动容器中的shell中执行:

~ # ping 8.8.8.8

HTTP 的返回结果如下 (注意这个输出不全,是因为我们设定了一个命令超时的环境变量):

PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=36 time=47.227 ms
64 bytes from 8.8.8.8: seq=1 ttl=36 time=50.137 ms
64 bytes from 8.8.8.8: seq=3 ttl=36 time=47.619 ms

检查session.Run(cmd)错误并设定 HTTP 的返回状态码

当前中间件会在成功时返回200, 错误或超时时返回400

对于出错的命令,中间件会将stdoutstderr合并到一起通过 HTTP 的 body 返回

使用

我们写了一个 Dockerfile 的示例在[examples/driver_utils/simple-alpine/Dockerfile.sample](https://github.com/Edgenesis/shifu/blob/main/examples/driver_utils/simple-alpine/Dockerfile.sample),其中演示了如何将这个中间件加入到一个 alpine 的 Docker 镜像中

打包的 Docker 镜像会使用以下变量,因此我们需要在yaml文件中进行配置:

  • EDGEDEVICE_DRIVER_SSH_KEY_PATH(必填)
    • 用来建立 SSH 连接到自身的 SSH 密钥路径
  • EDGEDEVICE_DRIVER_HTTP_PORT (选填)
    • HTTP 服务的端口,默认为11112
  • EDGEDEVICE_DRIVER_EXEC_TIMEOUT_SECOND (选填)
    • 执行命令的超时,通过在命令前面加上timeout <seconds>来实现
  • EDGEDEVICE_DRIVER_SSH_USER (选填)
    • 我们 SSH 到自身容器的用户,默认为root

本文由边无际发布

标签:body,HTTP,Shifu,中间件,bytes,SSH,8.8
From: https://blog.51cto.com/u_15747563/6123364

相关文章

  • maui BlazorWebView Android 中混合使用https和http
    <BlazorWebViewHostPage="wwwroot/index.html"BlazorWebViewInitialized="blazorWebView_BlazorWebViewInitialized"> privatevoidblazorWebView_BlazorWebVie......
  • 初始HTTP和HTTP报文以及方法
    初始HTTP1.HTTP是什么HyperText Transfer Protocol超文本传输协议HTTP:超文本标记语言超文本:原先一个个单一的文本,通过......
  • https请求,Java代码忽略https证书:解决No subject alternative names present问题
    https请求,Java代码忽略https证书:解决Nosubjectalternativenamespresent问题packagecom.test.utils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;......
  • http协议心得
    1、超文本传输协议(HTTP,HyperTextTransferProtocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和......
  • http协议心得
        HTTP诞生之初主要是应用于WEB端内容获取,那时候内容还不像现在这样丰富,排版也没那么精美,用户交互的场景几乎没有。对于这种简单的获取网页内容的场景,HTTP表现得......
  • http协议心得
    支持客户/服务器模式。简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTT......
  • c语言http文件下载断点续传示例(libcurl)
    以下是C语言实现HTTP文件下载的断点续传示例代码。假设要下载的文件URL为http://example.com/example.zip,本地保存为example.zip。#include<stdio.h>#include<......
  • GET和POST方法的对比、HTTP状态码
    GET和POST方法的对比 1、语义GET:获取数据POST:创建数据2、发送数据GET通过地址在请求头中携带数据携带少量数据,可以使用GET请求,大量的数据可以使用POST请求3、缓存......
  • 使用socket 和 httpURLConnection发起http请求
    publicstaticvoidtest()throwsException{//http://127.0.0.1:8080/logger/userInetAddressinetAddress=InetAddress.getByName("www.baidu.......
  • HTTP方法
    常用的HTTP方法浏览器发送请求时采用的方法,和响应无关GET、POST、PUT、DELECT用来定义对于资源采取什么样的操作的,有各自的语义HTTP方法的语义增删改查GET获取数据:......