响应HTTP服务的shell脚本
前言
兄弟萌, 我实现了一个实用的小工具, 特来分享.
事情刚开始是这样的, 我需要一个脚本来实现代码仓库web hook
的任务, 首先想到的是直接调用php
, 但是php-fpm
是以www-data
用户运行的, 很多调用是无法实现的. 此时, 我就需要一个常驻的偶尔调用一下的, 能够以root
用户执行的http
服务器, 但是网上查了查, 发现并么有符合我要求的现成轮子, 于是它来了.
是什么
简单介绍一下这个轮子是做什么用的. 简单说, 就是启动一个执行shell
脚本的http
服务.
它启动一个服务, 来监听指定端口并响应HTTP
请求, 脚本在监听到新的请求后, 会根据请求路径调用响应的脚本执行任务并返回对应的内容.
如果需要HTTPS
外边再套一层nginx
就行了.
使用介绍
这个破玩意如何使用呢? 为了简化使用, 我将其打包成了docker
镜像. 注意, 此服务每一次调用会启动一个新的进程, 故不适用于高并发场景.
启动
假设脚本的本地运行目录为: /usr/share/script
.
创建文件/usr/share/script/test.bash
. 内容如下:
#!/usr/bin/env bashresponse "return"
给脚本赋予执行权限: chmod +x /usr/share/script/test.bash
docker
命令行启动:
docker run -it -d -p 80:80 -v /usr/share/script:/opt/script hujingnb/http_cron
docker-composer
启动:
version: '3.1'services:tcp_cron:build: hujingnb/http_croncontainer_name: http_cronrestart: alwaysport: - 80:80volumes:- /usr/share/script:/opt/script
OK, 此时访问请求: http:127.0.0.1/test
, 就会看到返回内容return
了.
脚本运行机制
路由分配
根据请求的request_uri
调用对应的脚本.
若请求为: /user/change_name
.
那么会将脚本的工作路径/opt/script
(工作路径通过环境变量WORKSPACE
修改) 与请求拼在一起, 拼接后的路径为: /opt/script/user/change_name
, 依次寻找以下后缀文件, 首次找到的为执行脚本:
/opt/script/user/change_name.pl
/opt/script/user/change_name.sh
/opt/script/user/change_name.bash
/opt/script/user/change_name.php
/opt/script/user/change_name.py
/opt/script/user/change_name.rb
若没有找到脚本, 或访问根路径, 返回404
.
注意, 所有脚本都需要赋予执行权限.
接收请求
脚本通过环境变量接收请求内容, bash
脚本可直接通过$METHOD_TYPE
读取. 有如下内容:
METHOD_TYPE
: 请求的方法.GET
POST
等HTTP_VERSION
: 请求的HTTP
版本.HTTP/1.1
REQUEST_URI
: 请求原始路径(去掉GET
参数的).QUERY_STR
:GET
请求的原始参数字符串FORM_CONTENT
: 若请求是POST
, 则此变量保存请求体的字符串内容.- 没有对内容进行解析. 因为根据
content-type
不同, 解析方式不同. 请自行解析
- 没有对内容进行解析. 因为根据
QUERY_PARAM_xxx
: 解析后的GET
请求参数.xxx
为参数名HEADER_xxx
: 请求的header
内容.xxx
为header
名称
不同类型脚本读取系统env
环境变量的方式不同, 请自行搜索.
响应请求
通过调用shell
命令response
进行返回. 如:
#!/usr/bin/env bash# 注意, 脚本在所有输出之前, 必须先调用 response 命令# status: 响应码. 默认为 200
# header_: 以 header_ 打头的参数为响应中添加的 header, 后面跟着 header 名. 可不传
# 最后的响应内容是必传参数. 若不需要, 可传空字符串
response --status=200 --header_ADD_HEADER=TEST "这里存放响应内容"
# 以极简的模式调用. 返回200, 并且没有响应体
# 若脚本全程没有审核输出, 则默认调用 response ""
# response ""# 后续的所有 echo 都作为响应内容输出
echo $QUERY_STR
若是其他脚本请参考调用系统命令的方式, 需要将response
的输出内容写到标准输出流.
配置
可通过如下配置进行自定义修改.
环境变量
WORKSPACE
: 修改运行脚本的查找目录. 默认为:/opt/script
.LISTEN_PORT
: 修改脚本监听的端口. 默认80
docker
命令行通过-e
参数添加环境变量
docker-composer
通过environment
参数修改环境变量
环境准备
为了保证镜像的大小, 只安装了必要的软件, 包括python
PHP
运行环境都没有. 故, 若你有额外需求的话, 有如下两种方式来实现系统环境的定制化:
1.覆盖/opt/init.bash
文件
镜像在每次启动时, 都会首先执行/opt/init.bash
文件, 可以在这里安装额外的软件等初始化操作.
请注意, /opt/init.bash
脚本每次镜像启动都会执行一次. 此脚本默认不执行任何操作.
2. 镜像引用
你也可以通过FROM
的方式来制作自己的镜像.
Dockerfile地址
原文链接: https://hujingnb.com/archives/729
响应HTTP服务的shell脚本相关推荐
- telnet登录路由器启动服务的shell脚本
因为在测试中经常要telnet登录到路由器中去配置环境启动路由器,每次都输入一遍命令太麻烦了,想着写一个shell脚本实现自动登录.配置环境.启动服务的过程. 脚本实现是使用expect来实现的,所以 ...
- mysql shell无法启动服务_[shell脚本] mysql服务启动脚本
服务启动脚本(初始化.启动.登录) #!/bin/bash export PID=/usr/local/nestdb_master/bin/mysqld export PASSWORD=123456 ...
- Linux网络服务与shell脚本——Shell编程之条件语句
第八章 Shell编程之条件语句 一.条件测试 1.测试命令 (1)test 条件表达式 (2)[条件表达式] (3)$?:根据返回值判断前者是否成立 2.文件测试:根据指定路径名称,判断对应文件或目 ...
- Linux网络服务与shell脚本——Postfix邮件服务器搭建
Postfix邮件系统 1.电子邮件系统基础 (1)邮件系统角色.邮件协议 ①邮件系统的角色 1)MTA(Mail Transfer Agent,邮件传输代理):邮件服务器软件 2)MUA(Mail ...
- Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用...
一.Shell基础应用 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 切换用户的Shell环境 2> 练习命令历史.命令别名 ...
- shell 脚本与常用的bash命令
文章目录 关于shell 常用的bash 命令 文件相关 文件编辑 进程相关 其他 bash编程基础 全局变量 局部变量 环境变量 基本类型 运算 组合 条件 比较符 循环 函数 重定向 echo 和 ...
- shell 脚本-01 变量、字符串、数组
简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通 ...
- 如何写SHELL脚本?尝试自己编写一个简单脚本
背景 现在多数的服务器都是Linux系统的,需要通过shell来进行操作,而利用shell脚本,可以大大提高开发维护的效率. 知识剖析 什么是shell shell是一个命令行解释器,它为用户提供了一 ...
- shell上传文件到服务器,shell脚本上传文件到ftp服务器
shell脚本上传文件到ftp服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...
最新文章
- 继清华之后,北邮成立人工智能研究院
- AI一分钟 | 华为余承东携Mate 10高调亮相CES,不惧美国运营商放鸽子;日本推“手掌支付”服务,竟靠手相和手掌静脉识别
- Facebook参与AI芯片设计大混战!
- matlab的fft函数写法,matlab的fft函数的使用例子
- 【数据竞赛】懒人特征筛选算法!
- RestTemplate带参发送get及post请求携带headers请求头代码示例
- Boost::context模块callcc的jump_void测试程序
- 2021云栖大会丨首批阿里云计算巢认证合作伙伴获得授牌,阿里云与合作伙伴共筑云上生态
- C++轮子队-第三周(需求改进原型设计)
- 学习 Shell —— 认识 shell
- [ 总结 ] 删除通过find查找到的文件
- 数学建模——相关系数(2)——假设检验
- 下载google code中源码的几个工具
- 集合的三种遍历方式/集合的嵌套/产生任意范围内的随机数
- 生命旅程中何生命个体
- 最新MTK芯片型号汇总,MTK开发资料大全下载
- Centos 在 Selenium 使用中的异常:chrome not reachable
- C#语言入门详解1-12
- linux限制指定ip禁止访问指定端口,linux设置iptables禁止某个IP访问
- kaggle——泰坦尼克数据集
热门文章
- 在emIDE中创建STM32项目
- __declspec(naked)和__asm编写实践总结
- 同学们对《现代软件工程》课程的意见
- mysql 事物 锁行 测试_MySQL Transaction--RR事务隔离级别下加锁测试
- 与时间相关的java源码_Java 基于当前时间获取和计算时间
- android string 去掉斜杠,Android – PATH中的改装和斜杠字符
- html中什么是语义,html – “语义正确”是什么意思?
- 安卓能硬改的手机机型_【每日新闻】小米11部分镜头参数爆料;华为重新采购手机零部件 重启4G手机生产...
- MATLAB仿真TSC在哪里找,-bash:tsc:找不到命令
- Oracle distinct后加as,【大话IT】为何加distinct之后就不走索引了