linux如何查看某个端口接收到的数据

我的问题是在linux如何查看apache的header,也就是How to dump entire HTTP requests header with apache

结果发现没有合适的答案,google了一下,找了一些资料,然后我就整理一下做个记录。

首先要肯定的是apache本身不提供这种功能,如果非要有的话可以加上这个功能之后重新编译即可。

方法一:用tcpdump命令

sudo /usr/sbin/tcpdump -s 0 -X 'tcp dst port 80'

把port改为你想要监听的端口即可在linux下监听某个端口的数据。但是打印出来的数据不是很人性化。

方法二:用ngrep命令

#如果没有ngrep命令,首先要安装

sudo yum -y install ngrep
#然后可以指定端口 或者 正则表达式
ngrep port 80
ngrep -q '^GET .* HTTP/1.[01]'
#更详细的用法 参考 
man ngrep

方法三:开发apache模块
这个办法比较复杂,还要自己编译,重启apache等。
既然是一个方法,就接着介绍吧。

#首先创建一个模块
apxs -g -n dump_header
#到这个目录修改代码,mod_dump_header.c
cd dump_header
vi mod_dump_header.c
#删除所有内容
#vi 普通模式下 输入下面 几个命令,gg dG
#然后把下面的代码拷贝进去,编译,安装然后重启
apxs -a -i -c mod_dump_header.c
apachectl restart
#代码
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
int iterate_func(void *req, const char *key, const char *value) {
	int stat;
	char *line;
	request_rec *r = (request_rec *)req;
	if (key == NULL || value == NULL || value[0] == '\0')
		return 1;
	fprintf(stderr, "%s => %s\n", key, value);
        fflush(stderr);
	line = apr_psprintf(r->pool, "%s => %s\n", key, value);
	stat = ap_rputs(line, r);
        return 1;
}
/* The sample content handler */
static int dump_header_handler(request_rec *r)
{
    apr_table_do(iterate_func, r, r->headers_in, NULL);
    return DECLINED;
}

static void dump_header_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(dump_header_handler, NULL, NULL, APR_HOOK_FIRST);
}

/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA dump_header_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                  /* create per-dir    config structures */
    NULL,                  /* merge  per-dir    config structures */
    NULL,                  /* create per-server config structures */
    NULL,                  /* merge  per-server config structures */
    NULL,                  /* table of config file commands       */
    dump_header_register_hooks  /* register hooks                      */
};

其他网络命令

除此之后还有比较常用的网络命令。

linux下往某个端口发送数据,可以用telnet、nc、ssh等。

linux下监听某个端口,最简单的办法就是nc,nc -l 8888

既可以监听8888端口,你就可以往这个端口发送数据量。

其他还有netstat、tcpdump、iptables、ifconfig、nstat、sysctl等。一个个man一下看看吧。

linux下查看哪个进程占用某个端口,用下面的命令即可:

netstat -antlp|grep 8080

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>