Skip to content

Instantly share code, notes, and snippets.

@brett-schneider
Last active September 29, 2021 11:04
Show Gist options
  • Save brett-schneider/7c1d0ff0b94969bfc74634c341130a67 to your computer and use it in GitHub Desktop.
Save brett-schneider/7c1d0ff0b94969bfc74634c341130a67 to your computer and use it in GitHub Desktop.
port scanner for bash
#!/bin/bash
## helpers
dec2ip() {
local delim ip dec=$@
for e in {3..0}
do ip+=${delim}$(((dec>>(8*e))&0xFF)) && delim=.
done
printf '%s\n' "$ip"
}
usage() {
echo "${0} ip[/mask]:port[-port]"
echo "use cidr notation"
exit $@
}
## checks and init
# check: exactly one parameter
[ $# == 1 ] || usage 1
# check: parameter format
echo "$1" | egrep -q '^(\d+\.){3}\d+(\/\d+)?:\d+(-\d+)?$' || usage 2
# init: proceed to split
tgt="$1"
cidr=$(echo "${tgt}" | cut -d':' -f1)
port=$(echo "${tgt}:" | cut -d':' -f2)
plo=$(echo "${port}" | cut -d'-' -f1)
phi=$(echo "${port}" | cut -d'-' -f2)
mask=$(echo "${cidr}/" | cut -d'/' -f2)
ip=$(echo "${cidr}/" | cut -d'/' -f1)
eval dip=$(echo "\$(((((((($ip))" | sed 's/\./)<<8\)\+/g')
lower=${dip}
upper=${dip}
if [ ! -z "$mask" ]
then
bmask=$((2**32-2**(32-mask)))
lower=$((dip&bmask))
upper=$(((((1<<32)-1)^bmask)+lower))
fi
for hst in $(seq -f %.0f ${lower} ${upper})
do hip=$(dec2ip ${hst})
for ps in $(seq -f %.0f ${plo} ${phi})
do timeout 1 bash -c "echo >/dev/tcp/${hip}/${ps} && echo \"ip ${hip}:${ps} is open\" || echo \"ip ${hip}:${ps} is closed\""
done
done
@brett-schneider
Copy link
Author

default cidr mask to /32

@brett-schneider
Copy link
Author

skip calculation when mask empty

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