【问题标题】:Monitoring URL Requests from Shell Script从 Shell 脚本监视 URL 请求
【发布时间】:2017-07-14 03:47:53
【问题描述】:

我需要在 Mac 中创建一个 shell 脚本,它会监控,如果从任何浏览器或程序中访问指定的 URL(例如,*.google.com),shell 脚本将提示或执行操作。谁能指导如何做到这一点?

【问题讨论】:

  • 如果您需要监控点 X 和 Y 之间的流量,说明 X 和 Y 是什么很重要。例如,X 可以是本地以太网网络上的计算机,或者是咖啡店的 wifi ,或者只是一个特定的服务器。而且Y也需要明确定义,例如X中所有机器都必须通过的网络的网关服务器。另一个需要澄清的重要事情是您需要监控的协议。它只是HTTP吗?还是 HTTPS?
  • 我只是想在用户从任何浏览器/脚本/任何机器上点击 url 时运行我的脚本。可能吗? @janos
  • 我不知道是否可以像您想要的那样简单。我不会说任何关于 OSX 的事情,因为我对此一无所知。我假设一切都在同一台机器上。在 Linux 中,您可以组合 tcpdumpincron。喜欢:tcpdump dst port 80 or dst port 443 > /some/log/file 并配置 incrontab 以在每次更新 /some/log/file 时运行您的 bash 脚本。
  • 另一种选择是使用http_proxyhttps_proxy 环境变量,然后指向本地安装的apache 并使用mod_actions 执行您的脚本。但它只适用于理解和尊重这些环境变量的应用程序。
  • 你能指导更多的方向吗?谢谢@Azize

标签: bash macos shell url netstat


【解决方案1】:

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

$ 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>

我从未尝试过,但理论上它应该可以工作。

【讨论】:

    【解决方案2】:

    如果您想监控或捕获网络流量,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 上不可用;您可以将 tail -f 包裹在 while read 循环中:

    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

    【讨论】:

    • 它给了我以下错误:'pktap_filter_packet: pcap_add_if_info(en3, 1) failed: pcap_add_if_info: pcap_compile_nopcap() failed'
    • 这通常意味着您的tcpdump 命令行选项中有错误。您运行的确切命令是什么?
    • 当我运行sudo tcpdump -l dst host *.google.com 时,它给出了错误。当我运行 sudo tcpdump -l dst host google.com 并从浏览器访问 google.com 时,它只是一直在听,但没有显示结果。即使对于sudo tcpdump -ql dst host google.com | while read line; do echo "Match found"; done,它也没有显示任何内容。
    • 不幸的是,tcpdump(或者更确切地说是底层的pcap)不允许使用通配符。借助 Google 所做的有趣的全球流量平衡,google.com 为我工作;您可以尝试更明确地使用 sudo tcpdump -l dst host www.google.com ,但这不一定会捕获到 *.google.com 的所有流量。
    【解决方案3】:

    首先我们必须将 url 放入我们必须监控的 sample.txt 文件中。

    FILEPATH=/tmp/url
    INFILE=$FILEPATH/sample.txt
    OUTFILE=$FILEPATH/url_status.txt
    
    > $OUTFILE
    
    for file in `cat $INFILE`
    do
    echo -n "$file |" >> $FILEPATH/url_status.txt
    timeout 20s curl -Is $file |head -1 >> $FILEPATH/url_status.txt
    done
    
    grep '200' $OUTFILE|awk '{print $1"   Url is working fine"}' > /tmp/url/working.txt
    grep -v '200' $OUTFILE|awk '{print $1"    Url is not working"}' > /tmp/url/notworking.txt
    
    COUNT=`cat /tmp/url/notworking.txt | wc -l`
    
    if [ $COUNT -eq 0 ]
            then
                    echo "All url working fine"
            else
                    echo "Issue in following url"
                    cat /tmp/url/notworking.txt
    fi
    

    【讨论】:

      猜你喜欢
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多