【问题标题】:python capturing environment variables from proxypython从代理捕获环境变量
【发布时间】:2012-02-25 02:25:20
【问题描述】:

当我对代理使用外部 bash 脚本时,我会得到所有环境变量

#!/bin/bash

CAPTURE_FILE=/var/log/capture_data
env >> ${CAPTURE_FILE}

# we use exit code 1 to ensure this does not effect the actual browsing
exit 1
#

客户端访问网页时该脚本的输出:

HTTP_PORT=80
HTTP_HOST=ads.cnn.com
SERVER[adserver]=ad3ad3:9678:1
CLIENT[referer]=http://edition.cnn.com/
HTTP_PROTO=http
CLIENT[host]=ads.cnn.com
SERVER[vary]=Cookie
SERVER[connection]=Keep-Alive
CLIENTID=2
USERNAME=anonymous@192.168.221.1
SERVER[keep-alive]=timeout=5, max=15
SERVER[date]=Thu, 02 Feb 2012 12:09:46 GMT
SERVER[content-type]=text/html
CLIENT[user-agent]=Safari
PWD=/
VERSION=SR.4.2.2.MR.20110523

现在,我将 os.environ 用于 python(感谢这里以前的一篇文章),它可以工作,但只能从终端而不是当代理将所有请求传递给它时

#!/usr/bin/env python

import os
import sys

def capture():

    log = os.environ
    data = open("/tmp/capture.log", "a")
    for key in log.keys():
        data.write((key))
        data.write(" : ")
        for n in log[key]:
            data.write('%s' % ((n)))
        data.write("\n")
    data.close()
    sys.exit(1)

def main():

    capture()

if __name__ == "__main__":
    main()

我可以从标准 sys.stdin.readlines() 读取数据,但是当代理将请求重定向到脚本时,我会从环境变量中获得更精确的结果...

任何想法为什么 python 脚本不显示任何数据?

来自 /var/log/messages 的日志

Feb  3 22:29:02 safesquid capture.py: abrt: detected unhandled Python exception in /opt/safesquid/safesquid/scripts/capture.py
Feb  3 22:30:00 safesquid capture.py: abrt: detected unhandled Python exception in /opt/safesquid/safesquid/scripts/capture.py
Feb  3 22:30:00 safesquid capture.py: abrt: detected unhandled Python exception in /opt/safesquid/safesquid/scripts/capture.py
Feb  3 22:30:01 safesquid capture.py: abrt: detected unhandled Python exception in /opt/safesquid/safesquid/scripts/capture.py

已解决:

我将这个相同的脚本移植到 centos 6.2 并且它工作了....似乎它在 fedora 上遇到了问题。

【问题讨论】:

  • 嗯?它不显示任何数据,因为您从未告诉过它。你想达到什么目的?
  • 我只想读取从代理传递过来的环境变量..
  • 您能否向我们提供一些有关您的设置以及您想要实现的目标的更多信息?
  • 我正在尝试获取每个 HTTP 请求的源 IP,并基于该脚本将用户重定向到某些站点。我使用了 sys.stdin.readlines() 但它不会抛出源ip 但我得到了所有其他字段,但是 bash 中的 env 变量显示了所有 HTTP 标头,包括客户端 IP...
  • 什么在为您的 HTTP 请求提供服务?你在用python http server吗?

标签: python linux proxy


【解决方案1】:

如果你的输出与 unix env 命令相同,你可以直接调用它吗?

log = subprocess.check_output("env")

【讨论】:

  • 不,当流量来自代理到脚本时,它不会记录。如果我从命令行传递 STDIN 数据,则工作正常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 2012-01-18
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多