Shell-Script

它不是在命令行中指定單個主機名,而是從文件中讀取多個目標 IP 地址的列表

  • May 2, 2022

我想這樣做,而不是在命令行上指定單個主機名,而是從文件中讀取多個目標 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 個目標。

所以你需要在一個循環中加入主要部分

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

請注意,該$( cat "$ATHOSTFILE )部分將替換為內容 $ ATHOSTFILE, and read “element by element”, each element being splitted using $ IFS(通常:任何空格、製表符和換行符都將充當分隔符)。

關於語法和結構還有很多其他的事情要說,但這應該會引導你朝著正確的方向前進。

引用自:https://unix.stackexchange.com/questions/701123