我想这样做,而不是在命令行上指定单个主机名,而是从文件中读取多个目标 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 分割(通常:任何空格、制表符和换行符将充当分隔符)。
关于语法和结构还有很多其他的事情要说,但这应该会引导您走向正确的方向。