我在服务器上运行一个 HTTP 应用程序。我无法修改该应用程序,但我想在向该应用程序发送特定 POST 请求时触发事件。
我想运行一个 bash 脚本并向其传递参数,例如发出请求的客户端的 IP 和 HTTP 请求的标头。
我可以使用什么工具来实现这一点?我希望它尽可能轻量,并且需要在无头机器上运行。
答案1
我认为这些场景的一个好选择是使用httpry
(在 Github 上)。它针对的是 HTTP 流量。输出解析起来非常简单,您不必像 那样关心过滤规则tcpdump
。与大多数其他相关工具一样,httpry
它基于。libpcap
构建它很简单,make
就像使用其他纯源代码工具一样(./configure
上次我尝试时没有这样做)。
答案2
实现此目的的一种方法是修改 apache,使用 mod_security 或 mod_dumpio 记录发布数据(假设您使用的是 Apache Web 服务器,虽然没有说明,但我暗示您正在使用 bash)。(请参阅http://www.cyberciti.biz/faq/apache-mod_dumpio-log-post-data/和https://modsecurity.org/documentation/modsecurity-apache/1.9.3/html-multipage/07-logging.html)。
然后使用某种工具来监控输出并将其提供给 bash。(我首先想到的是,fail2ban 可能可以配置为执行此操作,但我没有尝试过)。或者,您可以尝试通过 bash 解析日志流并挑选出您需要的内容,或者可能有其他工具可以执行此操作。一种粗略但简单的方法,取决于您的时间框架有多紧张,可能是使用 bash 脚本定期轮换日志文件(例如每分钟)作为日志轮换的一部分。
答案3
我找到了一种使用 node.js 和 node_pcap 模块来实现此目的的方法。
您可以将其安装为这里描述。
它附带一个 http 监听器的示例,可以像这样调用。
sudo node_modules/pcap/examples/http_trace -f "tcp port 80"
它生成如下输出
12:11:53.131 undefined:35748 -> 127.0.0.1:80 #2 HTTP 1.1 request: GET /example/css.css
12:11:53.131 127.0.0.1:80 -> undefined:35748 #2 HTTP 1.1 response: 304 Not Modified
12:11:53.131 127.0.0.1:80 -> undefined:35748 #2 HTTP 1.1 response complete 6.08KB
这个例子足以满足我的目的。它提供了方法、URL 和 IP 地址。