bash for 루프에서 printf 문을 한 번 실행하려고 시도 중입니다.

bash for 루프에서 printf 문을 한 번 실행하려고 시도 중입니다.

어떻게 하면 좋을지 궁금합니다.

printf "Credentials found!"

여러 자격 증명이 발견되면 한 번만.

스크린샷

Attempting Dictionary Attack on 192.168.91.130

Credentials Found!

Log into the telnet server by running telnet -l admin 192.168.91.130

When prompted enter the password found 'admin'

Credentials Found!

Log into the telnet server by running telnet -l sfx 192.168.91.130

When prompted enter the password found 'toor'

루프 bash:

for i in "${!user[@]}"; do
    printf "The Username & Password is %s : %s\n\n" "${user[i]}" "${pass[i]}" >> SSH-Credentials.txt

    printf "${NCB}Credentials Found!${NC}\n\n"

    printf "Log into the SSH server by running ${YELLOW}ssh ${user[i]}@$ip${NC}\n\nWhen prompted enter the password found ${YELLOW}'${pass[i]}'\n"
    printf "${NC}\n"
done

답변1

다음과 같이 테스트를 수행할 수 있습니다 $i.

    [[ "$i" -lt 1 ]] && printf "I am only printed once\n"

    # OR
    (( i < 1 )) && printf "I am only printed once\n"

    # OR
    ! (( i )) && printf "I am only printed once\n"

    # OR
    [ "$i" -lt 1 ] && printf "I am only printed once\n"

    # OR
    if [[ "$i" -lt 1 ]]; then
        printf "I am only printed once\n"
    fi

사용하지 않는다고 가정하면연관 bash 배열.

간단히 말해서:index가 1보다 작으면 인쇄합니다.


가독성을 위해 해당 줄도 분리했을 것입니다. 넓은 길. 다음과 같이 말할 수도 있습니다.

printf '%s %s some long text' \
"$var1" "$var2"

변수에 대문자를 사용하는 것도 나쁜 습관입니다.

정보는 일반적으로 다음에도 인쇄되어야 합니다.stderr, 그래서 >&2.

또한 다음을 사용했을 것입니다:

prinf '%s@%s' "${user[i]}" "$ip" >&2

대신에:

prinf "${user[i]}@$ip" >&2

답변2

배열에 요소가 있으면 헤더를 출력합니다 user.

if [[ ${#user[@]} -gt 0 ]]; then
    printf '%sCredentials Found!%s\n\n' "$NCB" "$NC"
fi

그런 다음 루프를 수행하십시오.

for i in "${!user[@]}"; do
    printf 'The Username & Password is %s : %s\n\n' "${user[i]}" "${pass[i]}" >> SSH-Credentials.txt

    cat <<END_MESSAGE
Log into the SSH server using ${YELLOW}ssh ${user[i]}@$ip$NC
When prompted, enter the password found: ${YELLOW}${pass[i]}$NC

END_MESSAGE
done

관련 정보