Skip to content

Instantly share code, notes, and snippets.

@Fusl
Last active August 23, 2020 17:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Fusl/6a27b3d5bbdf0acdd87ae73d8344359a to your computer and use it in GitHub Desktop.
Save Fusl/6a27b3d5bbdf0acdd87ae73d8344359a to your computer and use it in GitHub Desktop.
Ping a target IPv4 address using all mtr.sh probes worldwide sorted by average RTT
#!/usr/bin/env bash
target="${1}"
if [ "x${target}" == "x" ]; then
echo "Usage: ${0} <IPv4/6 address>"
exit 1
fi
#if echo -n "${target}" | grep -qE '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'; then
# ip_proto=4
#fi
#if echo -n "${target}" | grep -q ':'; then
# ip_proto=6
#fi
if echo -n "${target}" | grep -q ':'; then
ip_proto=6
else
ip_proto=4
fi
probes_list=$(curl -s https://mtr.sh/probes.json | jq --arg ip_proto "${ip_proto}" -r 'keys[] as $k | if (.[$k].status == true and (.[$k].caps.ping == true or .[$k].caps.ping == ($ip_proto | tonumber))) then $k + "\t" + .[$k].unlocode + "\t" + .[$k].country + "\t" + .[$k].city + "\t" + .[$k].provider else "" end' | grep -vE '^$')
probes_count=$(echo "${probes_list}" | wc -l)
echo -ne "Tracing: ${target} [$(printf '%*s\n' ${probes_count} '')]\rTracing: ${target} [" 1>&2
results=$(
echo "${probes_list}" | awk -F'\t' '{print $1}' | xargs -n1 -P0 -I% sh -c 'echo "% "$(curl -s "https://mtr.sh/%/mtr/'${target}'" | base64 -w0 || echo -n "ZmFpbGVkCg=="); echo -n = 1>&2' | while read probe_id results; do
echo "${probe_id} "$(echo "${results}" | base64 -d | wc -l)" ${results}"
done | sort -nk2 | while read probe_id sort results; do
echo "${probes_list}" | awk -vprobe_id="${probe_id}" '$1 == probe_id'
echo "${results}" | base64 -d
done
)
echo
echo "${results}"
#!/usr/bin/env bash
set -euo pipefail
target="${1}"
if [ "x${target}" == "x" ]; then
echo "Usage: ${0} <IPv4/6 address>"
exit 1
fi
#if echo -n "${target}" | grep -qE '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'; then
# family=4
#fi
#if echo -n "${target}" | grep -q ':'; then
# family=6
#fi
if echo -n "${target}" | grep -q ':'; then
family=6
else
family=4
fi
probes_list=$(curl -s https://mtr.sh/probes.json | jq --arg family "${family}" -r 'keys[] as $k | if (.[$k].status == true and .[$k].caps.ping != false and .[$k]["status" + $family] == true) then $k + "\t" + .[$k].unlocode + "\t" + .[$k].country + "\t" + .[$k].city + "\t" + .[$k].provider else "" end' | grep -vE '^$')
probes_count=$(echo "${probes_list}" | wc -l)
echo -ne "Pinging: ${target} [$(printf '%*s\n' ${probes_count} '')]\rPinging: ${target} [" 1>&2
runtime=$(date +%s%N)
results=$(
echo "${probes_list}" | awk -F'\t' '{print $1}' | xargs -n1 -P0 -I% sh -c 'echo "% "$(curl -m60 -s "https://mtr.sh/%/ping/'${target}'" | fgrep -e "packets transmitted," -e "rtt min/avg/max/mdev" || echo "failed"); echo -n = 1>&2' | sort -t/ -rnk5 | while read probe_id results; do
echo "${probes_list}" | awk -vprobe_id="${probe_id}" -vresults="${results}" '$1 == probe_id {print $0"\t"results}'
done
)
runtime="$((($(date +%s%N)-${runtime})/1000000))"
average=$(
echo "${results}" | cut -f6 | tr '/' ' ' | awk "-vruntime=${runtime}" '
{
transmitted+=$1
received+=$4
if ($19 != "") {
num+=1
if (min == "" || min > $17) min=$17
sum+=$18
if (max == "" || max < $19) max=$19
std+=$20
}
}
END {
loss = sprintf("%.0f", (transmitted - received) / transmitted * 100);
avg = sprintf("%.0f", (sum / num) * 1000) / 1000;
std = sprintf("%.0f", (std / num) * 1000) / 1000;
print transmitted" packets transmitted, "received" received, "loss"% packet loss, time "runtime"ms rtt min/avg/max/mdev = "min"/"avg"/"max"/"std" ms"
}
'
)
echo 1>&2
(
echo "${results}"
echo -e "avg\tavg\tAverage\tAverage\tAverage\t${average}"
) | column -ts$'\t'
@Fusl
Copy link
Author

Fusl commented Nov 30, 2016

Example output:

› bash mtrsh.sh 8.8.8.8 | sed -r 's/^.{34}//'
rufip  Russia          Vladivostok         Vostoktelecom     rtt min/avg/max/mdev = 125.507/125.676/126.303/0.268 ms
ilrha  Israel          Rosh HaAyin         Netvision         rtt min/avg/max/mdev = 70.829/70.915/70.960/0.038 ms
ilrha  Israel          Rosh HaAyin         Goldenlines       rtt min/avg/max/mdev = 67.229/67.316/67.503/0.318 ms
iltlv  Israel          Tel Aviv            Bezeq             rtt min/avg/max/mdev = 64.920/64.941/64.986/0.322 ms
kzala  Kazakhstan      Almaty              Kazakhtelecom     rtt min/avg/max/mdev = 59.744/59.789/59.889/0.223 ms
ilpet  Israel          Petah Tikva         Bezeq             rtt min/avg/max/mdev = 57.585/57.798/59.235/0.559 ms
grath  Greece          Athens              LamdaHellix       rtt min/avg/max/mdev = 49.744/49.896/50.258/0.139 ms
brsao  Brazil          Sao Paulo           Durand            rtt min/avg/max/mdev = 47.448/47.752/48.220/0.383 ms
mdkiv  Moldova         Chisinau            Trabia Networks   rtt min/avg/max/mdev = 47.376/47.404/47.452/0.258 ms
altia  Albania         Tirana              Keminet           rtt min/avg/max/mdev = 43.446/43.520/43.633/0.286 ms
krsel  South Korea     Seoul               Korea Telecom     rtt min/avg/max/mdev = 34.116/35.831/40.426/2.264 ms
uaiev  Ukraine         Kiev                ColoCall          rtt min/avg/max/mdev = 34.924/34.964/35.009/0.146 ms
atgrz  Austria         Graz                UPC               rtt min/avg/max/mdev = 32.740/34.393/35.443/1.026 ms
vnhan  Vietnam         Hanoi               Vietel            rtt min/avg/max/mdev = 31.613/31.693/31.841/0.104 ms
atgrz  Austria         Graz                T-Mobile          rtt min/avg/max/mdev = 25.598/29.013/44.979/5.596 ms
atgrz  Austria         Graz                DIC-Online        rtt min/avg/max/mdev = 25.727/26.589/27.003/0.479 ms
hrzag  Croatia         Zagreb              Terrakom          rtt min/avg/max/mdev = 25.598/25.637/25.679/0.073 ms
atvie  Austria         Vienna              Anexia            rtt min/avg/max/mdev = 23.479/23.742/24.647/0.395 ms
atvie  Austria         Vienna              VPS247            rtt min/avg/max/mdev = 22.254/22.324/22.381/0.140 ms
itmil  Italy           Milano              VPS247            rtt min/avg/max/mdev = 19.208/19.257/19.383/0.118 ms
papty  Panama          Panama City         Offshore Racks    rtt min/avg/max/mdev = 18.145/18.374/18.703/0.248 ms
lvrix  Latvia          Riga                Yourserver        rtt min/avg/max/mdev = 14.829/15.449/19.839/1.492 ms
hkmkk  Hong Kong       Mong Kok            Softlayer         rtt min/avg/max/mdev = 15.194/15.324/15.737/0.230 ms
robuh  Romania         Bucharest           Hetnix            rtt min/avg/max/mdev = 14.994/15.079/15.159/0.092 ms
robuh  Romania         Bucharest           VPS247            rtt min/avg/max/mdev = 14.923/15.032/15.143/0.178 ms
idjkt  Indonesia       Jakarta             NewMedia Express  rtt min/avg/max/mdev = 14.718/14.857/15.182/0.216 ms
defks  Germany         Falkenstein         Hetzner DC21      rtt min/avg/max/mdev = 14.211/14.446/14.951/0.219 ms
defks  Germany         Falkenstein         Hetzner DC10      rtt min/avg/max/mdev = 13.964/14.262/14.811/0.231 ms
defks  Germany         Falkenstein         Hetzner DC13      rtt min/avg/max/mdev = 13.472/13.635/14.103/0.212 ms
defks  Germany         Falkenstein         Hetzner DC16      rtt min/avg/max/mdev = 13.319/13.572/14.107/0.269 ms
defks  Germany         Falkenstein         Hetzner DC19      rtt min/avg/max/mdev = 13.272/13.509/13.957/0.251 ms
defks  Germany         Falkenstein         Hetzner DC12      rtt min/avg/max/mdev = 13.239/13.399/13.831/0.225 ms
usclt  United States   Charlotte           Arachnitec        rtt min/avg/max/mdev = 12.124/12.213/12.597/0.199 ms
noosl  Norway          Oslo                TerraHost         rtt min/avg/max/mdev = 11.360/11.486/12.032/0.197 ms
defra  Germany         Frankfurt           Vultr/Choopa      rtt min/avg/max/mdev = 11.182/11.423/11.939/0.278 ms
uschi  United States   Chicago             Vultr/Choopa      rtt min/avg/max/mdev = 11.080/11.167/11.448/0.109 ms
luste  Luxembourg      Steinsel            root              rtt min/avg/max/mdev = 10.912/10.964/11.083/0.083 ms
usbuf  United States   Buffalo             ColoCrossing      rtt min/avg/max/mdev = 10.105/10.197/10.331/0.086 ms
bgvar  Bulgaria        Varna               Telecoms          rtt min/avg/max/mdev = 9.346/9.774/10.271/0.328 ms
fihel  Finland         Helsinki            Mediam            rtt min/avg/max/mdev = 7.970/8.033/8.380/0.136 ms
sgsin  Singapore       Singapore           SecureAX          rtt min/avg/max/mdev = 2.802/6.022/33.418/9.135 ms
nlcpi  Netherlands     Capelle a/d IJssel  NFOrce            rtt min/avg/max/mdev = 5.620/5.868/6.156/0.168 ms
nlams  Netherlands     Amsterdam           Vultr/Choopa      rtt min/avg/max/mdev = 4.615/4.710/4.818/0.106 ms
ruled  Russia          Saint Petersburg    vStoike           rtt min/avg/max/mdev = 4.285/4.421/4.506/0.102 ms
nlams  Netherlands     Amsterdam           Packet Host       rtt min/avg/max/mdev = 4.361/4.393/4.464/0.077 ms
inpnq  India           Pune                LeapSwitch        rtt min/avg/max/mdev = 4.026/4.111/4.172/0.071 ms
uswny  United States   West New York       Vultr/Choopa      rtt min/avg/max/mdev = 2.002/2.037/2.086/0.062 ms
usppy  United States   Parsippany          Packet Host       rtt min/avg/max/mdev = 2.008/2.020/2.038/0.050 ms
zajnb  South Africa    Johannesburg        Zappie Host       rtt min/avg/max/mdev = 1.797/1.812/1.825/0.008 ms
frpar  France          Paris               Vultr/Choopa      rtt min/avg/max/mdev = 1.644/1.694/1.718/0.049 ms
cator  Canada          Toronto             Priority Colo     rtt min/avg/max/mdev = 1.493/1.575/1.725/0.078 ms
usatl  United States   Atlanta             Vultr/Choopa      rtt min/avg/max/mdev = 1.181/1.220/1.245/0.028 ms
gblon  United Kingdom  London              Vultr/Choopa      rtt min/avg/max/mdev = 1.092/1.162/1.276/0.045 ms
jptyo  Japan           Tokyo               Vultr/Choopa      rtt min/avg/max/mdev = 1.062/1.144/1.245/0.068 ms
ussnn  United States   Sunnyvale           Packet Host       rtt min/avg/max/mdev = 1.091/1.119/1.217/0.037 ms
uslax  United States   Los Angeles         ARP Networks      rtt min/avg/max/mdev = 0.889/1.082/1.245/0.116 ms
senac  Sweden          Nacka               Portlane          rtt min/avg/max/mdev = 1.010/1.028/1.055/0.024 ms
ussfo  United States   San Francisco       Vultr/Choopa      rtt min/avg/max/mdev = 0.968/0.998/1.051/0.048 ms
esmad  Spain           Madrid              VPS247            rtt min/avg/max/mdev = 0.592/0.694/0.775/0.068 ms
usdal  United States   Dallas              Vultr/Choopa      rtt min/avg/max/mdev = 0.540/0.615/0.681/0.046 ms
usmia  United States   Miami               Vultr/Choopa      rtt min/avg/max/mdev = 0.575/0.612/0.707/0.042 ms
hubud  Hungary         Budapest            VPS247            rtt min/avg/max/mdev = 0.398/0.496/0.571/0.057 ms
ausyd  Australia       Sydney              Vultr/Choopa      rtt min/avg/max/mdev = 0.351/0.443/0.549/0.068 ms
uslax  United States   Los Angeles         Vultr/Choopa      rtt min/avg/max/mdev = 0.252/0.303/0.350/0.036 ms
chzrh  Switzerland     Zurich              VPS247            rtt min/avg/max/mdev = 0.270/0.292/0.330/0.027 ms
ussea  United States   Seattle             Vultr/Choopa      rtt min/avg/max/mdev = 0.236/0.285/0.367/0.051 ms

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