用户输入主机,开始端口,结束端口

时间:2019-01-30 22:28:38

标签: bash port-scanning

我有一个任务要在bash中创建portscanner脚本。我需要主机名,开始端口和结束端口一个接一个。也就是说,如果用户输入主机名,则脚本应请求启动端口,如果输入了主机和启动端口,则脚本应请求停止端口。这是我第一次学习基础脚本语言,所以我是一个完整的初学者。谢谢!

#!/bin/bash

# Basic bash port scanner
# CS 627 Project 1

t=$1
numval=$2
host=$3
startport=$4
stopport=$5

if [[ "$3" = "" ]]; then
    MESSAGE1="please enter host"
    echo $MESSAGE1
    read host

elif [[ "$3" = host && "$4" = "" ]]; then

    MESSAGE2="please enter startport"
    echo $MESSAGE2
    read startport

elif [[ "$4" = startport && "$5" = "" ]]; then

    MESSAGE3="please enter stopport"
    echo $MESSAGE3
    read stopport

elif [[ "$1" = "-t" && "$2" -gt 2 ]]; then

    MESSAGE4="time out changed to $2"
    echo $MESSAGE4

elif [[ "$1" = "-t" && "$2" -eq 2 ]]; then  

    MESSAGE5="time out is $2"
    echo $MESSAGE5

elif [[ "$1" = "-t" && "$2" -lt 2 ]]; then  

    MESSAGE6="time out changed to $2"
    echo $MESSAGE6
fi

function pingcheck
{
ping=`ping -c 1 $host | grep bytes | wc -l`
if [ "$ping" -gt 1 ]; then
    echo "$host is up"
else
    echo "$host is down, quitting"
    exit
fi
}

function portcheck
{
for ((counter=$startport; counter<=$stopport; counter++))
do
    if timeout 2 bash -c "echo >/dev/tcp/$host/$counter"
    then 
        echo "$counter open"
    else
        echo "$counter closed"
    fi
done
}

# first, check that the host is alive
pingcheck
# next, loop through the ports
portcheck

1 个答案:

答案 0 :(得分:0)

elif通常用于一系列互斥测试。仅当先前的elifif测试失败时,才进行elif中的测试。您不应该在脚本中使用它,因为如果用户忽略了host参数,则它们还将省略以下所有参数,并且需要为每个参数进行提示。因此,您应该对每项进行独立测试。

也不需要测试前面的参数。您正在针对文字字符串进行测试,但这不是用户要输入的内容。

这些MESSAGE#变量实际上没有任何意义。只需回显提示,或使用-p的{​​{1}}选项即可。

由于在脚本开始时已将命名变量分配给所有参数,因此应在read语句中使用这些变量,而不是if$1等。< / p>

您可以简化$2选项的处理。首先,将不同案例嵌套在单个测试中,以检查-t是否为$1。其次,请注意,您为-t-gt 2打印了相同的消息;因此实际上只有两种情况:-lt 2和其他所有情况。因此,您可以只使用-eq 2if

else