响应HTTP服务的shell脚本

以下内容均为第一版, 实际使用请查看最新信息, 转至: https://hujingnb.com/archives/729

前言

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

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

response "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_cron
    container_name: http_cron
    restart: always
    port: 
      - 80:80
    volumes:
      - /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地址

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: adb shell脚本是一种在Android设备上执行命令的脚本语言。它可以通过adb命令将脚本文件上传到设备上,并在设备上执行脚本中的命令。使用adb shell脚本可以自动化执行一系列操作,例如安装应用程序、启动应用程序、截屏、录制屏幕等。同时,adb shell脚本也可以用于调试和测试Android应用程序。 ### 回答2: adb shell脚本是一种可以在安卓设备上运行的脚本语言,它基于adb(Android Debug Bridge,Android调试桥)工具,通过adb命令在安卓设备上运行自动化脚本。 adb shell脚本的优势在于可以通过在电脑上编写脚本,可以快速准确地完成手动操作,例如自动化测试、数据分析、批处理等。此外,通过adb shell脚本还可以轻松地访问安卓设备的各种功能,例如文件操作、进程管理、网络配置等。 通过adb shell脚本,可以使用adb命令来实现自动化操作,例如: 1. 安装和卸载应用程序; 2. 启动和停止服务; 3. 清空应用程序数据; 4. 模拟按键和手势操作等。 在编写adb shell脚本时,需要使用shell语言的基础知识,例如变量、循环、条件语句等。另外,还需要了解adb命令的常用语法及其参数。 总的来说,adb shell脚本是一种强大的工具,可以在安卓设备上实现各种自动化操作。当需要快速执行一系列命令或实现一些复杂的任务时,adb shell脚本是一种效率高、准确度高的选择。 ### 回答3: adb shell是Android Debug Bridge(Android调试桥)的一部分。它是一个命令行工具,可让您通过adb连接到Android设备或模拟器的shell中。您可以使用adb shell脚本来与设备进行交互,执行命令或操作,以便进行测试、调试和开发。 使用adb shell脚本,您可以运行Android操作系统提供的大量命令。例如,您可以使用命令adb shell pm list packages列出设备上安装的所有包和应用名称。通过此命令,您可以快速找到您需要测试的应用程序或包名称,并进行测试。同样,您还可以使用adb shell input命令模拟用户输入,测试您应用程序是否正确响应。 另一个常见的应用场景涉及到开发人员需要在Android设备上执行自动化测试脚本。adb shell可以帮助您实现此目的。例如,如果您想要执行多个测试用例,可以编写adb shell脚本以执行测试用例,并将结果保存在txt文件中。这样,您就可以快速检查测试运行是否成功,是否有任何错误等。 最后,adb shell脚本还可以用于在设备上安装、卸载应用程序或启动Activity。这对于测试和调试应用程序非常有用,在这些过程中,您需要经常进行此类操作。只需编写一个简单的脚本,一次性完成所有安装、卸载或启动操作,就可以简化您的工作流程,并快速进行启动和测试。 总之,adb shell脚本是Android开发人员、测试人员和其他技术人员的重要工具。通过使用adb shell,您可以快速查找Android设备的状态和信息,并执行各种操作,以便进行测试、调试和开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值