Find Available IP Addresses
After a while, available IP addresses on the subnet may become hard to come by. Whatever spreadsheet you used to track IP allocations is likely out of date. Here’s a simple script that will scan the specified subnet and give you a list of IPs that don’t ping and have no associated DNS records. This should help you narrow down your choices.
#!/bin/bash # .. .. .. .. .. .. .. .. .. ... .. .. .. .. .. .. .. .. .. .. .. .. ... # : ( : : Identify available IP addresses on : # : ( ,) : : the subnet : # : ). ( ) : : : # : (, )' (. : : : # : \WWWWWWWW/ : : : # : '--..--' : : : # : }{ : : : # : {} : : : # : |/ _ _ _ \ / _ _| _ : : : # : |\| (_|/_\/\/\/ (_)| |<_\ : : : # : / : : : # : www.krazyworks.com : : : # ... .. .. .. .. .. .. .. .. .. ... .. .. .. .. .. .. .. .. .. .. .. .. # .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. # Copyright 2015, KrazyWorks LLC : # : # This program is free software: you can redistribute it and/or modify : # it under the terms of the GNU General Public License as published by : # the Free Software Foundation, either version 3 of the License, or : # (at your option) any later version. : # : # This program is distributed in the hope that it will be useful, : # but WITHOUT ANY WARRANTY; without even the implied warranty of : # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the : # GNU General Public License for more details. : # : # You should have received a copy of the GNU General Public License : # along with this program. If not, see <http://www.gnu.org/licenses/>. : # .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. if [ ! "" ] then echo "Specify subnet like so: 192.168.1" exit 1 fi subnet="" configure() { tmpfile="/tmp/free_ip_scan.tmp" } cleanup() { if [ -f "${tmpfile}" ] then /bin/rm -f "${tmpfile}" fi } is_alive_ping() { ping -c 4 $1 >/dev/null 2>&1 [ $? -ne 0 ] && echo $1 } pingdo() { for i in ${subnet}.{10..250} do is_alive_ping $i & disown done | sort -t. -k4 -n > "${tmpfile}" } digdo() { if [ -r "${tmpfile}" ] then echo "The following IPs are not pingable and are not in DNS, so they *may* be available:" for ip in `cat "${tmpfile}"` do if [ `dig +short -x "${ip}" 2>/dev/null | wc -l` -eq 0 ] then echo "${ip} seems available" fi done | column -t else echo "Scraped the bottom of the pickle barrel but came up dry" fi } # RUNTIME configure cleanup pingdo digdo cleanup