명령줄에서 단일 호스트 이름을 지정하는 대신 파일에서 여러 대상 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의 내용으로 대체되고 "요소별"로 읽혀지며 각 요소는 $IFS를 사용하여 구분됩니다(일반적으로 모든 공백, 탭 및 줄 바꿈이 구분 기호 역할을 합니다).
구문과 구조에 대해 할 말이 많지만 이것이 올바른 방향으로 안내해 줄 것입니다.