Den Inhalt von /dev/urandom in eine Variable einfügen?

Den Inhalt von /dev/urandom in eine Variable einfügen?

Dies ist eine Fortsetzung meines vorherigen Threads: - Datumsbefehl an eine Variable übergeben?

Ok, also ich möchte, dass /dev/urandom 4 Ziffern für mich generiert. Und sie in eine Variable einfügt.

Hier ist ein Beispiel meines Bash-Skripts: -

#!/bin/bash
for (( c=0; c<=10; c++))
do
        a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

        echo $a
done

Der einzige Grund, warum ich die Ergebnisse „echoen“ möchte, besteht darin, dass ich tatsächlich sehen kann, dass /dev/urandom die 4 Ziffern korrekt für mich generiert hat.

Für das Bash-Skript, das ich erstellen möchte, muss ich dies programmgesteuert tun, da ich mit den generierten Ergebnissen weitere Operationen durchführen möchte.

Ich muss die Ergebnisse also nicht „wiedergeben“.a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

Tatsächlich 4 zufällige Ziffern in die Variable „a“ einfügen? Wenn ich „a“ aus meinem Skript wiedergebe, bleibt die Konsole einfach hängen und ich muss „STRG+C“ verwenden, um meine Konsole wiederherzustellen.

Ich versuche lediglich, 4 zufällige Ziffern aus /dev/urandom in eine Variable einzufügen.

Ich bin neu im Bereich Bash-Skripting, daher sind alle Ratschläge willkommen und ich danke Ihnen im Voraus für jegliche Hilfe oder Vorschläge.

Antwort1

Wenn Sie keine Sicherheit benötigen, können Sie die in Bash integrierteRANDOMVariable. Um eine Zufallszahl zwischen 0 und 9999 einschließlich zu erhalten, $((RANDOM % 10000))ergibt sich eine kleine Tendenz zu Werten unter 767, da die Werte $RANDOMim Bereich [0, 32767] gleichmäßig verteilt sind. Um eine gleichmäßige Verteilung zu erhalten und führende Nullen zu setzen:

while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}

Beachten Sie erneut, dass dies nicht überall dort anwendbar ist, wo Sicherheit ein Problem darstellt. Die Ausgabe $RANDOMist nicht unvorhersehbar.

Wenn Sie Sicherheit benötigen, /dev/urandomist dies der richtige Ort, um zufällige Daten abzurufen. foldBei den meisten aktuellen Unix-Versionen ist ein Aufruf nicht erforderlich: Sie können mit 4 Zeichen abrufen head -c.

a=$(</dev/urandom tr -dc 0-9 | head -c 4)

head -cist nicht POSIX und nicht auf OpenBSD vorhanden, aber es ist auf anderen BSDs und auf Linux vorhanden (sowohl mit GNU Coreutils als auch mit BusyBox).

Wenn Sie Portabilität auf Systeme benötigen, die nicht über verfügen head -c, ist dies ein guter Ersatz, der dem POSIX-Standard entspricht. Beachten Sie jedoch, dass Sie den Aufruf fold -w 4 | head -n 1benötigen , da sonst für immer Zeilen mit 4 Ziffern ausgegeben werden.headfold

Antwort2

foldwird einfach den unendlichen Zahlenstrom falten und aist somit auf unbestimmte Zeit definiert. Sie müssen einen Beendigungsbefehl hinzufügen, am einfachsten head:

 a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"

Vergleichen Sie einfach das Verhalten dieser beiden Befehle

tr -dc '[:digit:]' < /dev/urandom | fold -w 4  
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1

Das erste zeigt einen unendlichen Strom vierstelliger Zufallszahlen, während das zweite nach einer Zeile abbricht.

verwandte Informationen