Skip to content

Instantly share code, notes, and snippets.

@ginokent
Created August 31, 2018 03:11
Show Gist options
  • Save ginokent/fcd09b666a8e7bd6fc356b5f410f0ff5 to your computer and use it in GitHub Desktop.
Save ginokent/fcd09b666a8e7bd6fc356b5f410f0ff5 to your computer and use it in GitHub Desktop.
#!/bin/bash
_err() {
printf "$(date +'%Y-%m-%dT%H:%M:%S%z') [ERROR] $@" >&2
}
_usage() {
_err "Usage: $(basename $0) {$(sed "s/ () /|/g; s/ ()$//g;" <<< $(declare -f | egrep "^[[:alpha:]][[:graph:]]+[[:space:]]\(\)"))} \$IPADDR/\$PREFIX\n"
}
_ipaddrx() {
(IFS=.; printf "%02x%02x%02x%02x" $ipaddr)
}
_netmaskx() {
printf "%08x" $(((2**32)-(2**(32-prefix))))
}
_netaddrx() {
printf "%08x" $((0x$(_ipaddrx)&0x$(_netmaskx)))
}
netaddr() {
declare netaddrx=$(_netaddrx)
printf "%d.%d.%d.%d\n" "0x${netaddrx:0:2}" "0x${netaddrx:2:2}" "0x${netaddrx:4:2}" "0x${netaddrx:6:2}"
}
list() {
declare i j netaddrx=$(_netaddrx)
declare -a addrsx
addrsx=( $(for i in $(seq 1 $((2**(32-prefix)-2))); do printf " %08x" $((0x$netaddrx + i)); done) )
for j in ${addrsx[*]}; do
printf "%d.%d.%d.%d\n" "0x${j:0:2}" "0x${j:2:2}" "0x${j:4:2}" "0x${j:6:2}"
done
}
ping() {
list \
| xargs -P256 -n1 ping -c1 -W1 \
| grep ttl \
| sort -V \
| sed 's/[^ ]* byte[^ ]* from //g; s/: icmp_seq=[01]*//g; s/\(=6[34]\)/\1 Linux/g; s/\(=12[78]\)/\1 Windows/g; s/\(=25[45]\)/\1 Unix/g; s/ \([^ ]*\)$/\1/g; /ttl/s/\(=[^126][^ ]*\) /\1 Unknown /g;' \
| column -t
}
if ! [[ "$1" =~ ^$(sed "s/ () /$|^/g; s/ ()$//g;" <<< $(declare -f | egrep "^[[:graph:]]+[[:space:]]\(\)"))$ ]]; then
_err "Please set method.\n"
_usage
exit 1
fi
if ! [[ "$2" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]]; then
_err "Please set address cidr format.\n"
_usage
exit 1
fi
declare ipaddr prefix
IFS=/ read ipaddr prefix <<< "$2"
"$1" "$2"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment