2017-07-14 38 views
2

我需要在Mac中创建一个shell脚本,它将监视并且如果指定的URL(例如* .google.com)从任何浏览器或程序中被命中,shell脚本将提示或做一个操作。任何人都可以指导如何做到这一点?监视来自Shell脚本的URL请求

+0

如果您需要监控X点和Y点之间的流量,说明X和Y是什么很重要。例如,X可以是本地以太网网络上的计算机,或咖啡店的wifi,或者只是一个特定的服务器。而且Y还需要有明确的定义,例如X中所有机器必须通过的网络的网关服务器。另一个需要澄清的重要事项是您需要监控的协议。它只是HTTP吗?还是HTTPS呢? – janos

+0

我只是想在用户从任何浏览器/脚本/任何机器点击url时运行我的脚本。可能吗? @janos –

+0

我不知道是否可以做到这一点,你想要的简单。我不会说任何有关OSX的事情,因为我对此没有任何了解。我假设一切都在同一台机器上。在Linux中,你可以结合'tcpdump'和'incron'。比如:'tcpdump dst port 80或dst port 443>/some/log/file'并配置'incrontab'以在每次'/ some/log/file'更新时运行'bash'脚本。 – Azize

回答

1

如果你想监视或捕获网络流量,tcpdump是你的朋友,不需要代理服务器,额外的安装等,并应该在股票Mac OS以及其他* nix变体上工作。

这里有一个简单的脚本 -

sudo tcpdump -ql dst host google.com | while read line; do echo "Match found"; done 

while read循环将继续运行,直到手动终止;用您的首选命令替换echo "Match found"。请注意,这将每页加载多次触发;如果您只希望它运行至看到相关流量,则可以使用tcpdump -c 1

由于Azize提到,您也可以让tcpdump在一个进程中输出到一个文件,并在另一个进程中监视该文件。 incrontab在Mac OS X上不可用;你可以在while read环包尾-f:

sudo tcpdump -l dst host google.com > /tmp/output & 
tail -fn 1 /tmp/output | while read line; do echo "Match found"; done 

有一个很好的similar script available on github。如果您想让过滤器更复杂,您也可以使用read up on tcpdump filters

+0

它给了我下面的错误:'pktap_filter_packet:pcap_add_if_info(en3,1)失败:pcap_add_if_info:pcap_compile_nopcap()失败 ' –

+0

这通常意味着你的'tcpdump'命令行选项有错误。你跑的确切命令是什么? –

+0

当我运行'sudo tcpdump -l dst host * .google.com'时,它给出了错误。当我运行'sudo tcpdump -l dst主机google.com'并从浏览器中点击google.com时,它只是一直在监听,但没有显示任何结果。即使对于'sudo tcpdump -ql dst主机google.com |而读线;做回声“找到匹配”;它没有显示任何东西。 –

3

这些环境变量会将代理设置设置为我的程序,如curl,wget和浏览器。

$ env | grep -i proxy 
NO_PROXY=localhost,127.0.0.0/8,::1 
http_proxy=http://138.106.75.10:3128/ 
https_proxy=https://138.106.75.10:3128/ 
no_proxy=localhost,127.0.0.0/8,::1 

在这里你可以看到curl方面,它总是连接上我的代理,你的情况你的代理服务器设置会是这样:http://localhost:3128

$ curl -vvv www.google.com 
* Rebuilt URL to: www.google.com/ 
* Trying 138.106.75.10... 
* Connected to 138.106.75.10 (138.106.75.10) port 3128 (#0) 
> GET http://www.google.com/ HTTP/1.1 
> Host: www.google.com 
> User-Agent: curl/7.47.0 
> Accept: */* 
> Proxy-Connection: Keep-Alive 
> 
< HTTP/1.1 302 Found 
< Cache-Control: private 
< Content-Type: text/html; charset=UTF-8 
< Referrer-Policy: no-referrer 
< Location: http://www.google.se/?gfe_rd=cr&ei=3ExvWajSGa2EyAXS376oCw 
< Content-Length: 258 
< Date: Wed, 19 Jul 2017 12:13:16 GMT 
< Proxy-Connection: Keep-Alive 
< Connection: Keep-Alive 
< Age: 0 
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>302 Moved</TITLE></HEAD><BODY> 
<H1>302 Moved</H1> 
The document has moved 
<A HREF="http://www.google.se/?gfe_rd=cr&amp;ei=3ExvWajSGa2EyAXS376oCw">here</A>. 
</BODY></HTML> 
* Connection #0 to host 138.106.75.10 left intact 

你的机器上安装Apache并将其配置为正向代理,像下面的例子中,关键是结合mod_actionsmod_proxy

Listen 127.0.0.1:3128 
<VirtualHost 127.0.0.1:3128> 
    Script GET "/cgi-bin/your-script.sh" 

    ProxyRequests On 
    ProxyVia On 
    <Proxy http://www.google.com:80> 
    ProxySet keepalive=On 
    Require all granted 
    </Proxy> 
</VirtualHost> 

我从来没有尝试过,但理论上它应该工作。