使用Bash 编写的 TCP 端口扫描器

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[@]} 是获取数组中全部的元素。
 
 



猜你喜欢

转载自blog.csdn.net/wangyangkobe/article/details/8546367