前言

兄弟萌, 我实现了一个实用的小工具, 特来分享.

事情刚开始是这样的, 我需要一个脚本来实现代码仓库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内容. xxxheader名称

不同类型脚本读取系统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脚本相关推荐

  1. telnet登录路由器启动服务的shell脚本

    因为在测试中经常要telnet登录到路由器中去配置环境启动路由器,每次都输入一遍命令太麻烦了,想着写一个shell脚本实现自动登录.配置环境.启动服务的过程. 脚本实现是使用expect来实现的,所以 ...

  2. mysql shell无法启动服务_[shell脚本] mysql服务启动脚本

    服务启动脚本(初始化.启动.登录) #!/bin/bash export PID=/usr/local/nestdb_master/bin/mysqld export PASSWORD=123456 ...

  3. Linux网络服务与shell脚本——Shell编程之条件语句

    第八章 Shell编程之条件语句 一.条件测试 1.测试命令 (1)test 条件表达式 (2)[条件表达式] (3)$?:根据返回值判断前者是否成立 2.文件测试:根据指定路径名称,判断对应文件或目 ...

  4. Linux网络服务与shell脚本——Postfix邮件服务器搭建

    Postfix邮件系统 1.电子邮件系统基础 (1)邮件系统角色.邮件协议 ①邮件系统的角色 1)MTA(Mail Transfer Agent,邮件传输代理):邮件服务器软件 2)MUA(Mail ...

  5. Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用...

    一.Shell基础应用 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 切换用户的Shell环境        2> 练习命令历史.命令别名        ...

  6. shell 脚本与常用的bash命令

    文章目录 关于shell 常用的bash 命令 文件相关 文件编辑 进程相关 其他 bash编程基础 全局变量 局部变量 环境变量 基本类型 运算 组合 条件 比较符 循环 函数 重定向 echo 和 ...

  7. shell 脚本-01 变量、字符串、数组

    简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通 ...

  8. 如何写SHELL脚本?尝试自己编写一个简单脚本

    背景 现在多数的服务器都是Linux系统的,需要通过shell来进行操作,而利用shell脚本,可以大大提高开发维护的效率. 知识剖析 什么是shell shell是一个命令行解释器,它为用户提供了一 ...

  9. shell上传文件到服务器,shell脚本上传文件到ftp服务器

    shell脚本上传文件到ftp服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...

最新文章

  1. 继清华之后,北邮成立人工智能研究院
  2. AI一分钟 | 华为余承东携Mate 10高调亮相CES,不惧美国运营商放鸽子;日本推“手掌支付”服务,竟靠手相和手掌静脉识别
  3. Facebook参与AI芯片设计大混战!
  4. matlab的fft函数写法,matlab的fft函数的使用例子
  5. 【数据竞赛】懒人特征筛选算法!
  6. RestTemplate带参发送get及post请求携带headers请求头代码示例
  7. Boost::context模块callcc的jump_void测试程序
  8. 2021云栖大会丨首批阿里云计算巢认证合作伙伴获得授牌,阿里云与合作伙伴共筑云上生态
  9. C++轮子队-第三周(需求改进原型设计)
  10. 学习 Shell —— 认识 shell
  11. [ 总结 ] 删除通过find查找到的文件
  12. 数学建模——相关系数(2)——假设检验
  13. 下载google code中源码的几个工具
  14. 集合的三种遍历方式/集合的嵌套/产生任意范围内的随机数
  15. 生命旅程中何生命个体
  16. 最新MTK芯片型号汇总,MTK开发资料大全下载
  17. Centos 在 Selenium 使用中的异常:chrome not reachable
  18. C#语言入门详解1-12
  19. linux限制指定ip禁止访问指定端口,linux设置iptables禁止某个IP访问
  20. kaggle——泰坦尼克数据集

热门文章

  1. 在emIDE中创建STM32项目
  2. __declspec(naked)和__asm编写实践总结
  3. 同学们对《现代软件工程》课程的意见
  4. mysql 事物 锁行 测试_MySQL Transaction--RR事务隔离级别下加锁测试
  5. 与时间相关的java源码_Java 基于当前时间获取和计算时间
  6. android string 去掉斜杠,Android – PATH中的改装和斜杠字符
  7. html中什么是语义,html – “语义正确”是什么意思?
  8. 安卓能硬改的手机机型_【每日新闻】小米11部分镜头参数爆料;华为重新采购手机零部件 重启4G手机生产...
  9. MATLAB仿真TSC在哪里找,-bash:tsc:找不到命令
  10. Oracle distinct后加as,【大话IT】为何加distinct之后就不走索引了