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