bash forループ内でprintf文を1回実行しようとしています

bash forループ内でprintf文を1回実行しようとしています

どうすればいいのかな?

printf "Credentials found!"

複数の資格情報が見つかった場合は 1 回だけ。

スクリーンショット

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配列

要するに:インデックスが 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

関連情報