【Shell 脚本实现 HTTP 请求的接收、解析、处理逻辑】

news2024/12/27 5:34:58

以下是一个实现客户端对 Shell HTTP 服务发起 POST 请求并传入 JSON 参数的完整示例。Shell 服务会解析收到的 JSON 数据,根据内容执行操作。


服务端脚本:http_server.sh

以下脚本使用 netcat (nc) 来监听 HTTP 请求,并通过 jq 工具解析 JSON 数据。

脚本内容:
#!/bin/bash

PORT=8080
echo "HTTP Server started on port $PORT..."

while true; do
    { 
        # 读取请求行
        read request_line
        echo "Request: $request_line"

        # 读取请求头,直到读取到空行(标志头部结束)
        content_length=0
        while read header && [[ "$header" != $'\r' ]]; do
            echo "$header"
            # 获取Content-Length值
            if [[ "$header" == Content-Length:* ]]; then
                content_length=$(echo $header | awk '{print $2}' | tr -d $'\r')
            fi
        done

        # 读取请求体
        if [[ $content_length -gt 0 ]]; then
            read -n $content_length body
            echo "Received Body: $body"

            # 解析JSON并判断内容
            command=$(echo "$body" | jq -r '.command')
            echo "Command: $command"

            # 根据JSON中的command字段执行不同操作
            case $command in
                "start")
                    response="Starting the service..."
                    ;;
                "stop")
                    response="Stopping the service..."
                    ;;
                *)
                    response="Unknown command: $command"
                    ;;
            esac

            # 返回HTTP响应
            echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n$response"
        else
            # 未提供JSON时返回错误
            echo -e "HTTP/1.1 400 Bad Request\r\nContent-Type: text/plain\r\n\r\nNo body received"
        fi
    } | nc -l -p $PORT -q 1  # 使用 netcat 监听端口
done

客户端:发送 POST 请求

客户端可以使用 curl 发送 POST 请求,并携带 JSON 数据。

客户端请求示例
# 发送启动命令
curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"command": "start"}'

# 发送停止命令
curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"command": "stop"}'

# 发送未知命令
curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"command": "restart"}'

# 未提供JSON数据
curl -X POST http://localhost:8080

完整运行过程示例

  1. 启动服务:

    $ ./http_server.sh
    HTTP Server started on port 8080...
    
  2. 客户端发起请求:

    $ curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"command": "start"}'
    Starting the service...
    
  3. 服务端日志输出:

    Request: POST / HTTP/1.1
    Content-Type: application/json
    Content-Length: 22
    
    Received Body: {"command": "start"}
    Command: start
    
  4. 发送其他命令:

    $ curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"command": "stop"}'
    Stopping the service...
    
    $ curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"command": "restart"}'
    Unknown command: restart
    

注意事项

  1. 依赖工具:

    • 确保系统安装了 jq(用于解析 JSON 数据),可以通过以下命令安装:
      sudo apt install jq  # Ubuntu/Debian
      sudo yum install jq  # CentOS/Red Hat
      
    • 确保系统安装了 netcat (nc)
  2. 安全性:

    • 此实现适合测试或开发环境,不建议直接用于生产环境。
    • 生产环境建议使用更成熟的解决方案(如 Python Flask 或 Node.js)。
  3. 扩展功能:

    • 可以在 case 中增加更多命令的处理逻辑。
    • 可以验证 JSON 数据的格式,确保字段完整性。

这套脚本适合演示简单的 HTTP 服务和 JSON 数据交互,非常适合学习和快速搭建原型。


nc 命令详解

nc 是 Netcat 的命令行工具,常用于网络调试、监听端口、传输数据等。以下是命令中 nc -l -p $PORT -q 1 的含义:

选项解释
  1. -l

    • 启用监听模式,使 nc 在指定端口上等待连接。
    • 没有这个选项时,nc 作为客户端发起连接。
  2. -p $PORT

    • 指定监听的端口号(这里用变量 $PORT 表示)。
    • 例如,-p 8080 表示监听 8080 端口。
  3. -q 1

    • 在最后一次传输完成后等待 1 秒,然后关闭连接。
    • 如果没有设置 -qnc 在交互完成后可能不会立即关闭连接。

nc 常用参数

通用选项
  1. -v

    • 启用详细模式,打印更多调试信息(如连接状态、错误等)。
    • 示例:nc -v 127.0.0.1 8080
  2. -z

    • 零 I/O 模式,用于扫描端口,不发送或接收数据。
    • 常与 -v 搭配使用,测试远程主机的端口开放状态。
    • 示例:nc -zv 127.0.0.1 22
  3. -u

    • 使用 UDP 而非默认的 TCP 协议。
    • 示例:nc -u 127.0.0.1 12345
  4. -n

    • 禁用 DNS 解析,仅允许使用 IP 地址。
    • 示例:nc -n 192.168.1.1 80
  5. -e <command>

    • 执行一个命令,将该命令的输入和输出通过网络传输(远程 shell)。
    • 示例:nc -l -p 1234 -e /bin/bash
监听模式选项
  1. -l

    • 启用监听模式。
  2. -p <port>

    • 指定监听的端口。
  3. -k

    • 保持监听状态,即使已有连接也不会退出。
    • 示例:nc -l -p 8080 -k
  4. -q <seconds>

    • 在最后一次传输完成后,等待指定的秒数后关闭连接。
文件传输相关
  1. -w <seconds>

    • 设置连接超时时间(默认无限制)。
  2. 文件传输(发送文件):

    # 在发送端:
    nc -l -p 1234 < file_to_send.txt
    
    # 在接收端:
    nc 127.0.0.1 1234 > received_file.txt
    
  3. 文件传输(目录打包):

    # 发送端打包目录
    tar -cvf - my_directory | nc -l -p 1234
    
    # 接收端解压
    nc 127.0.0.1 1234 | tar -xvf -
    

nc 的应用场景

  1. HTTP 服务测试
    模拟一个简单的 HTTP 服务器:

    echo -e "HTTP/1.1 200 OK\r\n\r\nHello World" | nc -l -p 8080
    
  2. 端口扫描
    检查远程主机开放的端口:

    nc -zv 192.168.1.1 20-100
    
  3. 远程 Shell
    在远程机器上打开一个 Shell:

    # 服务端(监听远程 Shell 连接):
    nc -l -p 1234 -e /bin/bash
    
    # 客户端:
    nc 192.168.1.2 1234
    
  4. 调试网络连接
    测试网络连通性:

    nc -v 8.8.8.8 53
    
  5. 文件传输
    通过网络快速传输文件:

    # 发送端:
    nc -l -p 1234 < file.txt
    
    # 接收端:
    nc 192.168.1.2 1234 > received_file.txt
    

注意事项

  • 使用 -e 启动远程 Shell 时需要小心,可能引发安全问题。
  • 某些系统可能使用不同版本的 Netcat,如 OpenBSD ncGNU nc,某些选项可能不支持。
  • 对于需要长期运行的服务,推荐使用 -k 持续监听。

通过 nc,我们可以快速搭建原型服务,调试网络问题,甚至完成文件传输任务,是一个非常实用的网络工具。

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

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

相关文章

SpringBoot该怎么使用Neo4j - 优化篇

文章目录 前言实体工具使用 前言 上一篇中&#xff0c;我们的Cypher都用的是字符串&#xff0c;字符串拼接简单&#xff0c;但存在写错的风险&#xff0c;对于一些比较懒的开发者&#xff0c;甚至觉得之间写字符串还更自在快速&#xff0c;也确实&#xff0c;但如果在后期需要…

【Calibre-Web】Calibre-Web服务器安装详细步骤(个人搭建自用的电子书网站,docker-compose安装)

文章目录 一、Calibre-Web和Calibre的区别是什么&#xff1f;使用场景分别是什么&#xff1f;二、服务器安装docker和docker-compose三、服务器安装Calibre-Web步骤1、安装完成后的目录结构2、安装步骤3、初始配置4、启动上传 四、安装Calibre五、docker-compose常用命令 最近想…

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…

ABAP - 系统集成之SAP的数据同步到OA(泛微E9)服务器数据库

需求背景 项目经理说每次OA下单都需要调用一次SAP的接口获取数据&#xff0c;导致效率太慢了&#xff0c;能否把SAP的数据保存到OA的数据库表里&#xff0c;这样OA可以直接从数据库表里获取数据效率快很多。思来想去&#xff0c;提供了两个方案。 在集群SAP节点下增加一个SQL S…

40分钟学 Go 语言高并发:【实战】分布式缓存系统

【实战课程】分布式缓存系统 一、整体架构设计 首先&#xff0c;让我们通过架构图了解分布式缓存系统的整体设计&#xff1a; 核心组件 组件名称功能描述技术选型负载均衡层请求分发、节点选择一致性哈希缓存节点数据存储、过期处理内存存储 持久化同步机制节点间数据同步…

w~视觉~合集27

我自己的原文哦~ https://blog.51cto.com/whaosoft/12715639 #视频AIGC~论文 1、Pix2Video: Video Editing using Image Diffusion 基于大规模图像库训练的图像扩散模型已成为质量和多样性方面最为通用的图像生成模型。它们支持反转真实图像和条件生成&#xff08;例如&…

MYSQL中的增删改查操作(如果想知道MYSQL中有关增删改查操作的知识,那么只看这一篇就足够了!)

前言&#xff1a;在 MySQL 中&#xff0c;增、删、改、查&#xff08;CRUD&#xff09;操作是基本的数据库操作&#xff0c;增操作&#xff08;INSERT&#xff09;用于插入数据&#xff0c;删操作&#xff08;DELETE&#xff09;用于删除数据&#xff0c;改操作&#xff08;UPD…

Ansible的yum和saltstack的哪个功能相似

Ansible的yum和saltstack的哪个功能相似 在 Ansible 和 SaltStack 中&#xff0c;Ansible 的 yum 模块 和 SaltStack 的 pkg 模块 功能相似。它们都用于管理软件包&#xff0c;支持安装、升级、删除和查询等操作。 Ansible 的 yum 模块 用途&#xff1a; 专门用于基于 Red Hat …

在做题中学习(76):颜色分类

解法&#xff1a;三指针 思路&#xff1a;用三个指针&#xff0c;把数组划分为三个区域&#xff1a; for循环遍历数组&#xff0c;i遍历数组&#xff0c;left是0区间的末尾&#xff0c;right是2区间的开头&#xff0c;0 1 2区间成功被划分 而上面的图画是最终实现的图样&…

Java版-速通数据结构-树基础知识

现在面试问mysql,红黑树好像都是必备问题了。动不动就让手写红黑树或者简单介绍下红黑树。然而&#xff0c;我们如果直接去看红黑树&#xff0c;可能会一下子蒙了。在看红黑树之前&#xff0c;需要先了解下树的基础知识&#xff0c;从简单到复杂&#xff0c;看看红黑树是在什么…

浙江工业大学《2024年828自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《浙江工业大学828自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

【计算机网络】实验11:边界网关协议BGP

实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议&#xff08;BGP&#xff09;的实际作用&#xff0c;并深入学习在路由器上配置和使用BGP协议的方法。通过实验&#xff0c;我将探索BGP在不同自治系统之间的路由选择和信息交换的功能&#xff0c;理解其在互…

微信小程序全屏显示地图

微信小程序在界面上显示地图&#xff0c;只需要用map标签 <map longitude"经度度数" latitude"纬度度数"></map>例如北京的经纬度为&#xff1a;116.407004,39.904595 <map class"bgMap" longitude"116.407004" lati…

InfluxDB 集成 Grafana

将InfluxDB集成到Grafana进行详细配置通常包括以下几个步骤&#xff1a;安装与配置InfluxDB、安装与配置Grafana、在Grafana中添加InfluxDB数据源以及创建和配置仪表板。以下是一个详细的配置指南&#xff1a; 一、安装与配置InfluxDB 下载与安装&#xff1a; 从InfluxDB的官…

【AI系统】ESPNet 系列

ESPNet 系列 本文将会介绍 ESPNet 系列&#xff0c;该网络主要应用在高分辨率图像下的语义分割&#xff0c;在计算内存占用、功耗方面都非常高效&#xff0c;重点介绍一种高效的空间金字塔卷积模块&#xff08;ESP Module&#xff09;&#xff1b;而在 ESPNet V2 上则是会更进…

【Axios】如何在Vue中使用Axios请求拦截器

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

w~深度学习~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12663254 #Motion Plan 代码 github.com/liangwq/robot_motion_planing 轨迹约束中的软硬约束 前面的几篇文章已经介绍了&#xff0c;轨迹约束的本质就是在做带约束的轨迹拟合。输入就是waypoint点list&#xff0c;约束…

大语言模型应用开发框架LangChain

大语言模型应用开发框架LangChain 一、LangChain项目介绍1、简介2、LangChain的价值3、实战演练 二、LangChain提示词大语言模型应用1、简介1.1、提示词模板化的优点1.2、提示词模板LLM 的应用1.3、Prompt 2、应用实战2.1、PromptTemplate LLM2.2、PromptTemplate LLM Outpu…

公众号文章标题的重要性

标题&#xff0c;不仅仅是一个简单的标题&#xff0c;它更是吸引读者眼球的“颜值担当”。 信息爆炸的今天&#xff0c;一个好的标题就是打开流量之门的金钥匙。那么&#xff0c;如何衡量一个标题的“颜值”呢&#xff1f;我们可以从两个维度来看&#xff1a;打开率和传播率。…

116. UE5 GAS RPG 实现击杀掉落战利品功能

这一篇&#xff0c;我们实现敌人被击败后&#xff0c;掉落战利品的功能。首先&#xff0c;我们将创建一个新的结构体&#xff0c;用于定义掉落体的内容&#xff0c;方便我们设置掉落物。然后&#xff0c;我们实现敌人死亡时的掉落函数&#xff0c;并在蓝图里实现对应的逻辑&…