コマンドラインで単一のホスト名を指定する代わりに、ファイルから複数の宛先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を使用して区切られます(通常はすべてのスペース、タブ、および改行が区切り文字として機能します)。

構文と構造について話すことがたくさんありますが、これが正しい方向に案内してくれます。

関連情報