узел ввода пользователя, стартовый порт, конечный порт - PullRequest
0 голосов
/ 31 января 2019

У меня есть задание для создания сценария portscanner в bash.Мне нужно имя хоста, начать порт и конец порта один за другим.То есть если пользователь вводит имя хоста, то скрипт должен запросить начальный порт, а если введены хост и начальный порт, то скрипт должен запросить остановочный порт.Это мой первый раз, когда я изучаю язык сценариев, поэтому я начинающий.Спасибо!

#!/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 голосов
/ 31 января 2019

elif обычно используется для последовательности взаимоисключающих тестов.Проверка в elif выполняется только в случае неудачи предыдущего теста if или elif.Вы не должны использовать его в своем скрипте, потому что если пользователь пропускает аргумент хоста, он также пропускает все следующие аргументы, и вам необходимо запросить каждый из них.Таким образом, вы должны сделать независимый тест для каждого.

Также нет необходимости проверять предыдущий аргумент.Вы проверяете его на предмет буквальной строки, но это не то, что пользователь собирается ввести.

На самом деле нет никакого смысла в этих MESSAGE# переменных.Просто введите подсказку или используйте параметр -p для read.

Поскольку вы назначили именованные переменные всем параметрам в начале скрипта, вы должны использовать эти переменные в операторах ifВместо $1, $2 и т. д.

Вы можете упростить обработку опции -t.Во-первых, вложите разные случаи в один тест, чтобы определить, является ли $1 -t.Во-вторых, обратите внимание, что вы печатаете одно и то же сообщение для -gt 2 и -lt 2;так что на самом деле есть только два случая: -eq 2 и все остальное.Так что вы можете просто использовать if и else.

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

if [[ "$startport" = "" ]]; then
    echo "please enter startport"
    read startport
fi

if [[ "$stopport" = "" ]]; then
    echo "please enter stopport"
    read stopport
fi

if [[ "$t" = "-t" ]]; then
    if [[ "$numval" -eq 2 ]]; then  
        echo "time out is $numval"
    else
        echo "time out changed to $numval"
    fi
fi
...