#!/bin/bash #------------ Port Pinger ----------- # Name: pping # Purpose: Pings ports of hosts by sending SYN packets and waiting fro an answer # Syntax1: pping HostAddr PortNr # Syntax2: pping NetAddr/CIDRNetmask PortNr # Author: Michel Bisson (www.linuxint.net) # Date: 04.10.2004 # 20.02.2005 Change the order of the arguments # Note: Needs to be ROOT and uses nmap port scanner program #------------------------------------ #----------- Allow only 2 arguments. No more no less. if [ "$#" -ne 2 ] ; then echo "ERROR: Bad number of arguments. Must be 2 arguments" echo "Syntax: pping HostAddr PortNr or pping NetAddr/CIDRNetmask PortNr " exit 1 fi #----------- Allow only numeric Port Number -------------------- #----- Use the numeric port number or find the port number in /etc/services if ! ( echo $2 | egrep "^[0-9]{1,5}$" &>/dev/null ) ; then port=$(expand /etc/services | grep "^$2 .*/tcp" | awk '{ print $2 }' | cut -d/ -f1) if [ ! "$port" ] ; then echo "ERROR: Bad port number" echo "Syntax: pping HostAddr PortNr or pping NetAddr/CIDRNetmask PortNr " exit 1 fi else port=$2 fi #------ if (echo $2 | grep "/" &>/dev/null) ; then # -------- Filter the result so that I get only one line per Host result=$(nmap -n --host_timeout 210 --max_rtt_timeout 210 -p $port -P0 $1 | egrep "Interesting|open" | sed 's/$/#/') IFS="#" for i in $result ; do if (echo $i | grep "Interesting" &>/dev/null) ; then IP=$(echo -n $i | awk '{ printf $4 }') else echo -n $i : $IP | sed -e 's/ open //' -e 's/:$//' fi done else # ------------ Show the result of the host poking on that port ------- nmap -n --host_timeout 210 --max_rtt_timeout 210 -p $port -P0 $1 | grep "open" | sed -e 's/ open //' fi echo