监控来自 Shell 脚本的 URL 请求
Monitoring URL Requests from Shell Script
我需要在 Mac 中创建一个 shell 脚本,它将监控是否命中指定的 URL(例如,*.google.com)从任何浏览器或程序,shell 脚本将提示或执行操作。谁能指导如何做到这一点?
这些环境变量将为我的程序设置代理设置,例如 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&ei=3ExvWajSGa2EyAXS376oCw">here</A>.
</BODY></HTML>
* Connection #0 to host 138.106.75.10 left intact
在您的机器上安装 apache 并将其配置为正向代理,就像下面的示例一样,技巧是结合 mod_actions
和 mod_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>
我从未尝试过,但理论上应该可以。
如果您想监控或捕获网络流量,tcpdump 是您的朋友 - 不需要代理服务器、额外安装等,并且应该可以正常工作 Mac OS以及其他 *nix 变体。
这是一个简单的脚本-
sudo tcpdump -ql dst host google.com | while read line; do echo "Match found"; done
while read
循环将保持 运行ning 直到手动终止;将 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. You can also read up on tcpdump filters。
首先我们必须将 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 " Url is working fine"}' > /tmp/url/working.txt
grep -v '200' $OUTFILE|awk '{print " 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
我需要在 Mac 中创建一个 shell 脚本,它将监控是否命中指定的 URL(例如,*.google.com)从任何浏览器或程序,shell 脚本将提示或执行操作。谁能指导如何做到这一点?
这些环境变量将为我的程序设置代理设置,例如 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&ei=3ExvWajSGa2EyAXS376oCw">here</A>.
</BODY></HTML>
* Connection #0 to host 138.106.75.10 left intact
在您的机器上安装 apache 并将其配置为正向代理,就像下面的示例一样,技巧是结合 mod_actions
和 mod_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>
我从未尝试过,但理论上应该可以。
如果您想监控或捕获网络流量,tcpdump 是您的朋友 - 不需要代理服务器、额外安装等,并且应该可以正常工作 Mac OS以及其他 *nix 变体。
这是一个简单的脚本-
sudo tcpdump -ql dst host google.com | while read line; do echo "Match found"; done
while read
循环将保持 运行ning 直到手动终止;将 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. You can also read up on tcpdump filters。
首先我们必须将 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 " Url is working fine"}' > /tmp/url/working.txt
grep -v '200' $OUTFILE|awk '{print " 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