[RndTbl] interesting unix pipe problem (stop whole pipe chain on first match)

Adam Thompson athompso at athompso.net
Sun May 31 09:49:38 CDT 2020


arping(8) solution:

#!/bin/sh
if ( ( for i in {1..254}; do ( arping -q -c 1 -w 1 192.168.0.$i; echo $? 
) & done; wait ) | grep -q -m 1 0 ) ; then
         echo "subnet has hosts"
else
         echo "subnet is empty"
fi


I'm sure it's possible to optimize that a bit further, but it seems 
adequate as-is.
-Adam



On 2020-05-31 08:53, Adam Thompson wrote:
> AFAIK, the solution is to not use nmap.
> I suspect arping would be just as useful for your case, and it runs
> nearly instantaneously.  Couple with the Linux version's "-f" flag,
> put it in the background, collect all the return codes somehow[*] and
> you're done in under 0.5sec.  I prefer arping because it eliminates
> stupid firewall problems.
> Or fping, which can scan an entire subnet in a second or so using ICMP
> in a single process in a couple of seconds.
> -Adam
> 
> On 2020-05-31 01:35, Trevor Cordes wrote:
>> Argh, sorry... for testing I was using a slightly bogus ip range...
>> please change the 254-254 to 100-254.  The corrected command line is
>> below:
>> 
>> echo 192.168.101 | \
>> timeout 30 bash -c \
>>  " \
>>   sint=\$(cat); \
>>   (nmap -ddd -vvv --send-ip \
>>   --host-timeout 5s --max-rtt-timeout 1s --initial-rtt-timeout 500ms \
>>   --max-retries 1 -S \$sint.1 -sn -PE \$sint.2 \$sint.100-254 2>&1 & \
>>   echo \$! >&3) \
>>   3>pidnmap \
>>   | grep --line-buffered -P 'RCVD.{0,30}?ICMP.{0,60}?Echo reply' \
>>   | (head -1 && kill \$(<pidnmap) 2>&1) \
>> " \
>> |grep RCVD || echo "no hosts found"
>> 
>> 
>> And for some reason when I paste this from a my gui mail client it has
>> syntax errors, but when I paste it from a tui mail client it works
>> fine... YMMV.  I guess I could post the one-line version:
>> 
>> echo 192.168.101 | timeout 30 bash -c "sint=\$(cat); (nmap -ddd -vvv
>> --send-ip --host-timeout 5s --max-rtt-timeout 1s --initial-rtt-timeout
>> 500ms --max-retries 1 -S \$sint.1 -sn -PE \$sint.2 \$sint.100-254 2>&1
>> & echo \$! >&3) 3>pidnmap | grep --line-buffered -P
>> 'RCVD.{0,30}?ICMP.{0,60}?Echo reply' | (head -1 && kill \$(<pidnmap)
>> 2>&1)" |grep RCVD || echo "no hosts found"
>> _______________________________________________
>> Roundtable mailing list
>> Roundtable at muug.ca
>> https://muug.ca/mailman/listinfo/roundtable
> _______________________________________________
> Roundtable mailing list
> Roundtable at muug.ca
> https://muug.ca/mailman/listinfo/roundtable


More information about the Roundtable mailing list