명령줄에서 단일 호스트 이름을 지정하는 대신 파일에서 여러 대상 IP 주소 목록을 읽습니다.

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

구문과 구조에 대해 할 말이 많지만 이것이 올바른 방향으로 안내해 줄 것입니다.

관련 정보