Shell-Script
它不是在命令行中指定單個主機名,而是從文件中讀取多個目標 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 個目標。
所以你需要在一個循環中加入主要部分
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(通常:任何空格、製表符和換行符都將充當分隔符)。關於語法和結構還有很多其他的事情要說,但這應該會引導你朝著正確的方向前進。