http://www.oschina.net/translate/tcp-port-scanner-in-bash
#!/bin/bash
alarm()
{
perl -e '
eval {
$SIG{ALRM} = sub{die};
alarm shift;
system(@ARGV);
};
if ($@) { exit 1 }
' "$@";
}
scan()
{
if [[ -z $1 || -z $2 ]];then
echo "Usage: $0 <host> <port, ports, port-range>"
return
fi
local host=$1
local ports=()
case $2 in
*-*)
IFS=- read start end <<< "$2"
for ((port=start; port<=end; port++));do
ports+=($port)
done
;;
*,*)
IFS=, read -ra ports <<< "$2"
;;
*)
ports+=($2)
;;
esac
for port in "${ports[@]}"
do
alarm 1 "echo > /dev/tcp/$host/$port && echo \"port $port is open\"" ||
echo "port $port is closed"
done
}
scan $
讲解:
alarm函数使用perl语言实现的,不太明白。
local host=$1
local ports=()
local用来生命变量是局部变量的,shell中声明的变量是全局变量,如果想声明局部变量需要使用local。
其中ports位数组,但是这是第一次看到这样的用法。
IFS=- read start end <<< "$2"
IFS=- read start end <<< "$2"
其中IFS为
Interal Field Separator,即“内部区域分隔符”,,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space character),制表符(tab) 以及新行(newline) 。先看下面一个简单示例:
http://www.groad.net/bbs/read.php?tid-6675.html
http://bash.cyberciti.biz/guide/$IFS
for port in "${ports[@]}"
${ports[@]} 是获取数组中全部的元素。