Intentando que una declaración printf se ejecute una vez en un bucle for de bash

Intentando que una declaración printf se ejecute una vez en un bucle for de bash

Me pregunto cómo haría para tener el

printf "Credentials found!"

solo una vez cuando se encuentran varias credenciales.

Captura de pantalla

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'

El bashlazo:

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

Respuesta1

Podrías hacer una prueba $icomo en:

    [[ "$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

Suponiendo que no usesmatriz bash asociativa.

En breve:Si el índice es menor que 1, imprima.


En aras de la legibilidad, también habría dividido esas líneas. Muy ancho. Tenga en cuenta que también puede decir:

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

Usar letras mayúsculas para las variables también es un mal hábito.

Normalmente, la información también debería imprimirse enstderr, entonces >&2.

También habría usado:

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

en lugar de:

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

Respuesta2

Genere el encabezado si la usermatriz tiene elementos.

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

Luego haz tu bucle.

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

información relacionada