【Shell 脚本实现 HTTP 请求的接收、解析、处理逻辑】
以下是一个实现客户端对 Shell HTTP 服务发起 POST
请求并传入 JSON 参数的完整示例。Shell 服务会解析收到的 JSON 数据,根据内容执行操作。
服务端脚本:http_server.sh
以下脚本使用 netcat (nc)
来监听 HTTP 请求,并通过 jq
工具解析 JSON 数据。
脚本内容:
#!/bin/bashPORT=8080
echo "HTTP Server started on port $PORT..."while true; do{ # 读取请求行read request_lineecho "Request: $request_line"# 读取请求头,直到读取到空行(标志头部结束)content_length=0while read header && [[ "$header" != $'\r' ]]; doecho "$header"# 获取Content-Length值if [[ "$header" == Content-Length:* ]]; thencontent_length=$(echo $header | awk '{print $2}' | tr -d $'\r')fidone# 读取请求体if [[ $content_length -gt 0 ]]; thenread -n $content_length bodyecho "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
完整运行过程示例
-
启动服务:
$ ./http_server.sh HTTP Server started on port 8080...
-
客户端发起请求:
$ curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"command": "start"}' Starting the service...
-
服务端日志输出:
Request: POST / HTTP/1.1 Content-Type: application/json Content-Length: 22Received Body: {"command": "start"} Command: start
-
发送其他命令:
$ 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
注意事项
-
依赖工具:
- 确保系统安装了
jq
(用于解析 JSON 数据),可以通过以下命令安装:sudo apt install jq # Ubuntu/Debian sudo yum install jq # CentOS/Red Hat
- 确保系统安装了
netcat (nc)
。
- 确保系统安装了
-
安全性:
- 此实现适合测试或开发环境,不建议直接用于生产环境。
- 生产环境建议使用更成熟的解决方案(如 Python Flask 或 Node.js)。
-
扩展功能:
- 可以在
case
中增加更多命令的处理逻辑。 - 可以验证 JSON 数据的格式,确保字段完整性。
- 可以在
这套脚本适合演示简单的 HTTP 服务和 JSON 数据交互,非常适合学习和快速搭建原型。
nc
命令详解
nc
是 Netcat 的命令行工具,常用于网络调试、监听端口、传输数据等。以下是命令中 nc -l -p $PORT -q 1
的含义:
选项解释
-
-l
- 启用监听模式,使
nc
在指定端口上等待连接。 - 没有这个选项时,
nc
作为客户端发起连接。
- 启用监听模式,使
-
-p $PORT
- 指定监听的端口号(这里用变量
$PORT
表示)。 - 例如,
-p 8080
表示监听 8080 端口。
- 指定监听的端口号(这里用变量
-
-q 1
- 在最后一次传输完成后等待 1 秒,然后关闭连接。
- 如果没有设置
-q
,nc
在交互完成后可能不会立即关闭连接。
nc
常用参数
通用选项
-
-v
- 启用详细模式,打印更多调试信息(如连接状态、错误等)。
- 示例:
nc -v 127.0.0.1 8080
-
-z
- 零 I/O 模式,用于扫描端口,不发送或接收数据。
- 常与
-v
搭配使用,测试远程主机的端口开放状态。 - 示例:
nc -zv 127.0.0.1 22
-
-u
- 使用 UDP 而非默认的 TCP 协议。
- 示例:
nc -u 127.0.0.1 12345
-
-n
- 禁用 DNS 解析,仅允许使用 IP 地址。
- 示例:
nc -n 192.168.1.1 80
-
-e <command>
- 执行一个命令,将该命令的输入和输出通过网络传输(远程 shell)。
- 示例:
nc -l -p 1234 -e /bin/bash
监听模式选项
-
-l
- 启用监听模式。
-
-p <port>
- 指定监听的端口。
-
-k
- 保持监听状态,即使已有连接也不会退出。
- 示例:
nc -l -p 8080 -k
-
-q <seconds>
- 在最后一次传输完成后,等待指定的秒数后关闭连接。
文件传输相关
-
-w <seconds>
- 设置连接超时时间(默认无限制)。
-
文件传输(发送文件):
# 在发送端: nc -l -p 1234 < file_to_send.txt# 在接收端: nc 127.0.0.1 1234 > received_file.txt
-
文件传输(目录打包):
# 发送端打包目录 tar -cvf - my_directory | nc -l -p 1234# 接收端解压 nc 127.0.0.1 1234 | tar -xvf -
nc
的应用场景
-
HTTP 服务测试
模拟一个简单的 HTTP 服务器:echo -e "HTTP/1.1 200 OK\r\n\r\nHello World" | nc -l -p 8080
-
端口扫描
检查远程主机开放的端口:nc -zv 192.168.1.1 20-100
-
远程 Shell
在远程机器上打开一个 Shell:# 服务端(监听远程 Shell 连接): nc -l -p 1234 -e /bin/bash# 客户端: nc 192.168.1.2 1234
-
调试网络连接
测试网络连通性:nc -v 8.8.8.8 53
-
文件传输
通过网络快速传输文件:# 发送端: nc -l -p 1234 < file.txt# 接收端: nc 192.168.1.2 1234 > received_file.txt
注意事项
- 使用
-e
启动远程 Shell 时需要小心,可能引发安全问题。 - 某些系统可能使用不同版本的 Netcat,如
OpenBSD nc
和GNU nc
,某些选项可能不支持。 - 对于需要长期运行的服务,推荐使用
-k
持续监听。
通过 nc
,我们可以快速搭建原型服务,调试网络问题,甚至完成文件传输任务,是一个非常实用的网络工具。
相关文章:

【Shell 脚本实现 HTTP 请求的接收、解析、处理逻辑】
以下是一个实现客户端对 Shell HTTP 服务发起 POST 请求并传入 JSON 参数的完整示例。Shell 服务会解析收到的 JSON 数据,根据内容执行操作。 服务端脚本:http_server.sh 以下脚本使用 netcat (nc) 来监听 HTTP 请求,并通过 jq 工具解析 JSO…...

【北京迅为】iTOP-4412全能版使用手册-第六十七章 USB鼠标驱动详解
iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...

【青牛科技】拥有两个独立的、高增益、内部相位补偿的双运算放大器,可适用于单电源或双电源工作——D4558
概述: D4558内部包括有两个独立的、高增益、内部相位补偿的双运算放大器,可适用于单电源或双电源工作。该电路具有电压增益高、噪声低等特点。主要应用于音频信号放大,有源滤波器等场合。 D4558采用DIP8、SOP8的封装形式 主要特点ÿ…...

Kafka 数据写入问题
目录标题 分析思路1. **生产者配置问题**:Kafka生产者的配置参数生产者和消费者的处理确定并优化 2. **网络问题**:3. **Kafka 集群配置问题**:unclean.leader.election.enable 4. **Zookeeper 配置问题**:5. **JVM 参数调优**&am…...

实战ansible-playbook(九)-profile配置- 确保 CUDA 和 MPI 环境变量正确设置并立即生效
Playbook 分析 --- - name: 确保 CUDA 和 MPI 环境变量正确设置并立即生效hosts: pod2 # 指定目标主机组或具体主机名become: yes # 使用特权提升(sudo),以root权限执行某些需要权限的任务remote_user: canopy # 远程连接使用的用户名vars: # 定义全局变量,用于Playbo…...

气膜馆:科技与环保融合的未来建筑新选择—轻空间
在全球城市化进程不断加快的背景下,传统建筑方式面临着越来越多的挑战。如何在有限的土地和资源条件下,快速、高效、环保地搭建符合多功能需求的建筑,成为现代建筑行业亟待解决的重要课题。而随着科技的进步与建筑材料的创新,一种…...

git回退到某个版本git checkout和git reset命令的区别
文章目录 1. git checkout <commit>2. git reset --hard <commit>两者的区别总结推荐使用场景* 在使用 Git 回退到某个版本时, git checkout <commit> 和 git reset --hard <commit> 是两种常见的方式,但它们的用途和影响有很…...

Preprocess
Preprocess数据预处理 文本 使用Tokenizer将文本转换为标记序列,创建标记的数值表示,并将它们组装成张量。 预处理文本数据的主要工具是标记器。标记器根据一组规则将文本拆分为标记。标记被转换为数字,然后转换为张量,这些张量…...

stm32 spi接口传输asm330l速率优化(及cpu和dma方式对比)
最近一段时间做了一个mems的项目,项目的方案是stm32g071做主控,读写3颗asm330l的硬件形态。最初是想放置4颗imu芯片,因为pcb空间布局的问题,改放了3颗。但对于软件方案来说无所谓,关键是如何优化spi的传输速率…...

数字时代的文化宝库:存储技术与精神生活
文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库:存储技术与精神生活 在数字化的浪潮中,存储技术如同一座桥梁,连接着过去与未来,承载着人类文明的瑰宝。随着存储容量的不断增…...

flex: 1 display:flex 导致的宽度失效问题
flex: 1 & display:flex 导致的宽度失效问题 问题复现 有这样的一个业务场景,详情项每行三项分别占33%宽度,每项有label字数不固定所以宽度不固定,还有content 占满标签剩余宽度,文字过多显示省略号, 鼠标划入展示…...

Hive 窗口函数与分析函数深度解析:开启大数据分析的新维度
Hive 窗口函数与分析函数深度解析:开启大数据分析的新维度 在当今大数据蓬勃发展的时代,Hive 作为一款强大的数据仓库工具,其窗口函数和分析函数犹如一把把精巧的手术刀,助力数据分析师们精准地剖析海量数据,挖掘出深…...

前端工程 Node 版本如何选择
1. Node 与 Npm 版本对应 这是一个必知必会的问题,尤其是对于维护那些老掉牙、一坨坨、非常大的有着长期历史的老破大工程。 1.1. package-lock.json 版本 首先你要会看项目的 package-lock.json 文件中的 lockfileVersion 版本号,这对于 NPM 安装来说…...

推荐在线Sql运行
SQL Fiddle 1、网址:SQL Fiddle - Online SQL Compiler for learning & practiceDiscover our free online SQL editor enhanced with AI to chat, explain, and generate code. Support SQL Server, MySQL, MariaDB, PostgreSQL, and SQLite.http://www.sqlfi…...

【数据结构】【线性表】特殊的线性表-字符串
目录 字符串的基本概念 字符串的三要素 字符串的基本概念 串的编码 串的实现及基本运算 顺序串的实现 串的静态数组实现 串的动态数组的实现 顺序存储的四种方案 链式串的实现 基本运算 方案三 方案一 字符串的基本概念 数据结构千千万,…...

app-1 App 逆向环境准备(mumu模拟器+magisk+LSPosed+算法助手+抓包(socksDroid+charles)+Frida环境搭建
一、前言 本篇是基于 mumu模拟器 进行环境配置记录。(真机的后面博客记录) 二、mumu模拟器magiskLSPosed算法助手 2.1、mumu模拟器 选择 mumu 模拟器,下载地址:https://mumu.163.com 安装完成后打开,找到设置中心进…...

在米尔FPGA开发板上实现Tiny YOLO V4,助力AIoT应用
学习如何在 MYIR 的 ZU3EG FPGA 开发板上部署 Tiny YOLO v4,对比 FPGA、GPU、CPU 的性能,助力 AIoT 边缘计算应用。 一、 为什么选择 FPGA:应对 7nm 制程与 AI 限制 在全球半导体制程限制和高端 GPU 受限的大环境下,FPGA 成为了中…...

【IT】测试用例模版(含示例)
这里写目录标题 一、测试用例模版二、怎么用模版示例如何使用这个模板 一、测试用例模版 一个相对标准的测试用例模板通常包含以下部分: 测试用例ID:唯一标识符,用于追踪测试用例。测试用例标题:简短描述测试用例的目的。测试用…...

react dnd——一个拖拽组件
React DnD是一个流行的库,用于在React应用程序中实现拖放功能。以下是对React DnD的详细解释,包括示例和API说明: 基本概念 在开始使用React DnD之前,了解以下几个基本概念是很重要的: Drag Source(拖动…...

3GPP R18 LTM(L1/L2 Triggered Mobility)是什么鬼?(三) RACH-less LTM cell switch
这篇看下RACH-less LTM cell switch。 相比于RACH-based LTM,RACH-less LTM在进行LTM cell switch之前就要先知道target cell的TA信息,进而才能进行RACH-less过程,这里一般可以通过UE自行测量或者通过RA过程获取,而这里的RA一般是通过PDCCH order过程触发。根据38.300中的描…...

Flutter解压文件并解析数据
Flutter解压文件并解析数据 前言 在 Flutter 开发中,我们经常需要处理文件的读取和解压。 这在处理应用数据更新、安装包、存档文件等场景中尤为常见。 本文将介绍如何在Flutter中使用archive插件来解压文件并解析数据。 准备 在开始之前,我们需要…...

21、结构体成员分布
结构体中的成员并不是紧挨着分布的,内存分布遵循字节对齐的原则。 按照成员定义的顺序,遵循字节对齐的原则存储。 字节对齐的原则: 找成员中占据字节数最大的成员,以它为单位进行空间空配 --- 遇到数组看元素的类型 每一个成员距离…...

TSWIKI知识库软件
TSWIKI 知识库软件介绍 推荐一个适合本地化部署、自托管的知识库软件 TSWIKI介绍 tswiki 是一个适合小团队、个人的知识库、资料管理的软件,所有数据均本地化存储。可以本地化、私有云部署,安装简单。在线预览。 主要功能说明 1、简化的软件依赖和安…...

深度学习安装环境笔记
1、输出cuda版本 torch.version.cuda 返回的是 PyTorch 在编译时所使用的 CUDA 版本,而不是运行时实际调用的 CUDA 版本。PyTorch 在运行时实际调用的 CUDA 版本取决于系统上安装的 CUDA 驱动和库。 import torch from torch.utils.cpp_extension import CUDA_HOME…...

使用android studio写一个Android的远程通信软件(APP),有通讯的发送和接收消息界面
以下是使用 Android Studio 基于 Java 语言编写一个简单的 Android APP 实现远程通信(这里以 TCP 通信为例)的代码示例,包含基本的通信界面以及发送和接收消息功能。 1. 创建项目 打开 Android Studio,新建一个 Empty Activity …...

学习Python的笔记14--迭代器和生成器
1.迭代器(Iterator) 概念: 迭代意味着重复多次,就像循环一样。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退。 1.iter…...

车机端同步outlook日历
最近在开发一个车机上的日历助手,其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现,毕竟手机日历是手机厂商自己带的系统应用,根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…...

教学案例:k相同的一次函数的图像关系
【题目】 请在同一个平面直角坐标系中画出一次函数y2x, y2x4的图象,并观察图象,你发现这两个图形有什么位置关系?为什么? 【答案】 图象是相互平行的两条直线 【解析】 一、教学活动形式 这里设计的教学活动形式是“画图 →…...

EmoAva:首个大规模、高质量的文本到3D表情映射数据集。
2024-12-03,由哈尔滨工业大学(深圳)的计算机科学系联合澳门大学、新加坡南洋理工大学等机构创建了EmoAva数据集,这是首个大规模、高质量的文本到3D表情映射数据集,对于推动情感丰富的3D头像生成技术的发展具有重要意义…...

Elasticsearch vs 向量数据库:寻找最佳混合检索方案
图片来自Shutterstock上的Bakhtiar Zein 多年来,以Elasticsearch为代表的基于全文检索的搜索方案,一直是搜索和推荐引擎等信息检索系统的默认选择。但传统的全文搜索只能提供基于关键字匹配的精确结果,例如找到包含特殊名词“Python3.9”的文…...