如何查看服务器正在执行的所有请求URL(最终URL)

时间:2015-11-06 15:40:51

标签: linux bash http command-line tcpdump

命令行URL的列表如何从服务器(* ux机器)向另一台机器发出请求。

例如,我在服务器 ALPHA_RE 的命令行中。 我对google.co.uk进行ping操作,并对bbc.co.uk进行另一次ping操作 我想从提示中看到:

google.co.uk bbc.co.uk

所以,不是我正在ping的机器的IP地址,而不是来自我将请求传递给google.co.uk或bbc.co.uk的服务器的URL,而是实际的最终网址。

请注意,只有普通ubuntu存储库中可用的软件包才可用 - 并且必须使用命令行

修改 最终目标是查看PHP脚本(由 cronjob 运行)请求的API URL;以及服务器请求'生活的API网址。 这些主要是对几个URL的GET和POST请求,我有兴趣知道params:

是否请求:

foobar.com/api/whatisthere?and=what&is=there&too=yeah

或者:

foobar.com/api/whatisthathere?is=it&foo=bar&green=yeah

cron作业或服务器是否会执行任何其他GET或POST请求? 而且,无论这些API给出什么样的响应(如果有的话)。

此外,API列表未知 - 因此您无法访问某个特定的URL。

修改 (指定了旧票证:请注意,我无法在该服务器上安装任何内容(没有额外的包,我只能使用"普通"命令 - 如tcpdump,sed,grep,...)//但是使用tcpdump获取这些信息非常困难,然后我可以安装软件包)

2 个答案:

答案 0 :(得分:3)

您可以使用 tcpdump grep 来获取有关来自主机的网络流量活动的信息,以下cmd行应该为您提供包含Host的所有行:

 tcpdump -i any -A -vv -s 0 |  grep -e "Host:"

如果我在一个shell中运行上面的命令并启动一个到stackoverflow的链接会话,我看到:

Host: www.stackoverflow.com
Host: stackoverflow.com

如果您想了解更多有关实际HTTP请求的信息,您还可以向grep添加语句以获取GET,PUT或POST请求(即-e" GET"),这可以为您提供一些信息相对URL(应与先前确定的主机组合以获取完整的URL)。

修改: 基于您编辑的问题,我试图做一些修改: 首先是tcpdump方法:

[root@localhost ~]# tcpdump -i any -A -vv -s 0 | egrep -e "GET" -e "POST" -e "Host:"
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
E..v.[@.@.......h.$....P....Ga  .P.9.=...GET / HTTP/1.1
Host: stackoverflow.com
E....x@.@..7....h.$....P....Ga.mP...>;..GET /search?q=tcpdump HTTP/1.1
Host: stackoverflow.com

还有一个ngrep:

[root@localhost ~]# ngrep -d any -vv -w byline | egrep -e "Host:" -e "GET" -e "POST"
^[[B  GET //meta.stackoverflow.com HTTP/1.1..Host: stackoverflow.com..User-Agent:
  GET //search?q=tcpdump HTTP/1.1..Host: stackoverflow.com..User-Agent: Links

我的测试用例是运行链接stackoverflow.com,将tcpdump放入搜索字段并按Enter键。

这可以在一行中获取所有URL信息。一个更好的替代方案可能是在您自己的服务器上简单地运行反向代理(例如nginx)并修改主机文件(如Adam的答案中所示)并让反向代理将所有查询重定向到实际主机并使用反向代理的日志记录功能从那里获取URL,日志可能更容易阅读。

编辑2: 如果使用命令行,例如:

ngrep -d any -vv -w byline | egrep -e "Host:" -e "GET" -e "POST" --line-buffered |  perl -lne 'print $3.$2  if /(GET|POST) (.+?) HTTP\/1\.1\.\.Host: (.+?)\.\./'

您应该看到实际的网址

答案 1 :(得分:1)

一个简单的解决方案是修改您的' / etc / hosts'文件拦截API调用并将它们重定向到您自己的Web服务器

api.foobar.com 127.0.0.1