我有一个任务要在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
答案 0 :(得分:0)
elif
通常用于一系列互斥测试。仅当先前的elif
或if
测试失败时,才进行elif
中的测试。您不应该在脚本中使用它,因为如果用户忽略了host参数,则它们还将省略以下所有参数,并且需要为每个参数进行提示。因此,您应该对每项进行独立测试。
也不需要测试前面的参数。您正在针对文字字符串进行测试,但这不是用户要输入的内容。
这些MESSAGE#
变量实际上没有任何意义。只需回显提示,或使用-p
的{{1}}选项即可。
由于在脚本开始时已将命名变量分配给所有参数,因此应在read
语句中使用这些变量,而不是if
,$1
等。< / p>
您可以简化$2
选项的处理。首先,将不同案例嵌套在单个测试中,以检查-t
是否为$1
。其次,请注意,您为-t
和-gt 2
打印了相同的消息;因此实际上只有两种情况:-lt 2
和其他所有情况。因此,您可以只使用-eq 2
和if
。
else