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

来源:互联网 发布:610特大网络诈骗告破 编辑:程序博客网 时间:2024/04/20 13:19

http://www.oschina.net/translate/tcp-port-scanner-in-bash

#!/bin/bashalarm(){perl -e 'eval {$SIG{ALRM} = sub{die};alarm shift;system(@ARGV);};if ($@) { exit 1 }' "$@";}scan(){    if [[ -z $1 || -z $2 ]];thenecho "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[@]}"    doalarm 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[@]} 是获取数组中全部的元素。



原创粉丝点击