Skip to content

Instantly share code, notes, and snippets.

@feczo
Created November 5, 2015 06:27
Show Gist options
  • Save feczo/eae831a08c98a94e6fd9 to your computer and use it in GitHub Desktop.
Save feczo/eae831a08c98a94e6fd9 to your computer and use it in GitHub Desktop.
BLOCKS=$(nslookup -q=TXT _cloud-netblocks.googleusercontent.com 8.8.8.8 | awk -F "spf1 " '{print $2}' | sed -e "s/include:/\n/g" | sed -e "s/?all\"//g" | grep -v ^$)
echo "$BLOCKS" | while read block; do nslookup -q=TXT $block 8.8.8.8 | awk -F "spf1 " '{print $2}' | sed -e "s/ip4:/\n/g" | sed -e "s/?all\"//g" |grep -v "^ip6:" | grep -v ^$; done ;
@Civil
Copy link

Civil commented Jul 2, 2018

Nowadays includes might also contain other includes. (e.x. netblocks1 contains include:_cloud-netblocks6.googleusercontent.com) so you need to do recursive query. A script that can do recursive queries will look like that (might also need some improvements though):

#!/bin/bash
resolve_include() {
    BLOCK="${1}"
    RES=$(nslookup -q=TXT ${BLOCK} 8.8.8.8 | awk -F "spf1 " '{print $2}' | sed -e "s/ip4:/\n/g;s/?all\"//g" | grep -v "^ip6:" | grep -v ^$)
    echo "${RES}"
}

RES="_cloud-netblocks.googleusercontent.com"
cont=true
while [[ ${cont} != "false" ]]; do
    NEW_RES=""
    CNT=0
    for r in ${RES}; do
        blocks="${r}"
        grep -q "include" <<< "${r}" && r=$(cut -d: -f 2 <<< "${r}")
        grep -q "googleusercontent.com$" <<< "${r}" && { blocks="$(resolve_include ${r})"; CNT=$((CNT+1)); }
        NEW_RES="${NEW_RES} ${blocks}"
    done
    if [[ ${CNT} -eq 0 ]]; then
        cont="false"
    fi
    RES="${NEW_RES}"
done
echo "${RES}" | sed 's/ /\n/g' | sort -u -n

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment