它不是在命令行上指定单个主机名,而是从文件中读取多个目标 IP 地址的列表

它不是在命令行上指定单个主机名,而是从文件中读取多个目标 IP 地址的列表

我想这样做,而不是在命令行上指定单个主机名,而是从文件中读取多个目标 IP 地址的列表。

#!/bin/bash -
# bannergrab.sh
function isportopen ()
{
    (( $# < 2 )) && return 1                           # <1>
    local host port
    host=$1
    port=$2
    echo >/dev/null 2>&1  < /dev/tcp/${host}/${port}   # <2>
    return $?
}

function cleanup ()
{
    rm -f "$SCRATCH"
}

ATHOST="$1"
SCRATCH="$2"
if [[ -z $2 ]]
then
    if [[ -n $(type -p tempfile) ]]
    then
    SCRATCH=$(tempfile)
    else
        SCRATCH='scratch.file'
    fi
fi

trap cleanup EXIT                                      # <3>
touch "$SCRATCH"                                       # <4>

if isportopen $ATHOST 21    # FTP                  <5>
then
    # i.e., ftp -n $ATHOST 
    exec 3<>/dev/tcp/${ATHOST}/21                      # <6>
    echo -e 'quit\r\n' >&3                             # <7>
    cat <&3  >> "$SCRATCH"                             # <8>
fi

if isportopen $ATHOST 25    # SMTP
then
    # i.e., telnet $ATHOST 25 
    exec 3<>/dev/tcp/${ATHOST}/25
    echo -e 'quit\r\n' >&3
    cat <&3  >> "$SCRATCH"
fi

if isportopen $ATHOST 80    # HTTP
then
    curl -LIs "https://${ATHOST}"  >> "$SCRATCH"      # <9>
fi

cat "$SCRATCH"   # <10>

包含列表的文件如下所示:

10.12.13.18
192.15.48.3
192.168.45.54
...
192.114.78.227

但是我如何以及在哪里放置像set target file:/home/root/targets.txt.或者需要以其他方式完成?

答案1

您似乎想让“$1”代表一个包含目标列表的文件,而不仅仅是 1 个目标。

所以你需要将主要部分包含在循环中

ATHOSTFILE="$1"
SCRATCH="$2"
for ATHOST in $( cat "$ATHOSTFILE" ); do
   ... # (the rest of the actions here)
done

请注意,该$( cat "$ATHOSTFILE )部分将被 $ATHOSTFILE 的内容替换,并“逐个元素”读取,每个元素使用 $IFS 分割(通常:任何空格、制表符和换行符将充当分隔符)。

关于语法和结构还有很多其他的事情要说,但这应该会引导您走向正确的方向。

相关内容