Wie liest man N zufällige Zeichen aus / dev / urandom ein?

50
read /dev/urandom 3

Das oben genannte funktioniert nicht. Wie kann ich zufällige Bytes /dev/urandomin der Bash lesen ?

Linux
quelle

Antworten:

44
random="$(dd if=/dev/urandom bs=3 count=1)"
Fadenscheinig
quelle
1
@Flimzy, wie geht das $()?
Linux
2
Die Ausgabe eines Befehls wird wie eine Variable behandelt. Anmerkung: Das ist ein Bashismus. Wenn Sie Bash nicht verwenden, müssen Sie möglicherweise stattdessen `` verwenden. `` ist universeller, aber ich denke $ () ist einfacher zu lesen.
Flimzy
@Flimzy, meinst It treats the output of a command like a variable.du eigentlich als String, oder?
Linux
2
Eine Variable kann eine Zeichenfolge sein ... oder eine Zahl. Es wird als Variable behandelt ... dann wird es je nach Kontext wie eine Zeichenfolge oder eine Zahl behandelt.
Flimzy
1
$()ist ziemlich universell, nicht bash-spezifisch. Übrigens: Achten Sie darauf, dass Sie nicht an die Grenzen der Zeichen gebunden sind, die die Shell in Variablen speichern kann. Beispielsweise lässt die von mir getestete Version von Bash Nullen (\ x00) aus der Zeichenfolge aus.
Gordon Davisson
44
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(Wenn Sie wörtliche Bindestrichzeichen verwenden möchten, muss das Bindestrichzeichen im Gegensatz zu am Ende der Zeichenfolge stehen *-_.)

Und um zu erklären, was aufgrund des obigen Satzes von Befehlen gemacht wird:

  1. head -c 500 /dev/urandom: Erhalten Sie die ersten 500 Zeichen (Bytes) von /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Entfernen Sie alle Zeichen außer den in angegebenen 'a-zA-Z0-9~!@#$%^&*_-'aus der Ausgabe des ersten Befehls.
  3. fold -w 3: Formatieren Sie die Ausgabe des zweiten Befehls so, dass er 3 Zeichen pro Zeile enthält.
  4. head -n 1: Zeigt die erste Zeile des Ergebnisses des dritten Befehls an stdout.
ADM
quelle
1
Er sucht nach 3 Bytes ...
Chris S
1
3 plus genaue Muster
ADM
Das ist ausgezeichnet.
Danijel-James W
3
Toll! Es gibt auch die char-Klassennamen ([: graph | print | etc:]) für die tr-Funktion, und dies könnte weiter vereinfacht werden, indem am Ende das a fold -w 3 | head -n 1durch ein ersetzt wird, head -c 3wenn das neue Zeilenzeichen nicht benötigt wird.
Zimmi
5
Wenn die Standardcodierung des Systems Multibyte ist (z. B. UTF-8), schlägt tr mit einem Illegal byte sequenceFehler fehl . Um dies zu beheben, verwenden Sie die "C" -Codierung. Ändern Sie den Befehl in:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff
33

Bitte überprüfen Sie man od.

Sie können zum Beispiel verwenden

od -vAn -N4 -tu4 < /dev/urandom

vorzeichenlose dezimale 4-Byte-Zufallszahlen zu generieren.

Ekrem Aksoy
quelle
1
Ekrem, willkommen bei SF. Ich bevorzuge normalerweise keine neuen Antworten auf lange akzeptierte Fragen, aber das unterscheidet sich wirklich von allen vorherigen Antworten und hat einige echte Vorteile - nett! +1 von mir, und ich hoffe, Sie bleiben in der Nähe von SF und tragen noch einige Zeit dazu bei.
MadHatter
19

Hier ist eine, die Base64-Strings erstellt. Beachten Sie, dass, obwohl sie auf Base64-Strings beschränkt sind, die Auffüllung von ihnen entfernt wird, sodass Sie sie nicht entschlüsseln können und sie wahrscheinlich sowieso nicht benötigen.

 cat /dev/urandom | base64 | head -c 5

Ersetzen Sie 5durch die Anzahl der gewünschten Zeichen.

Wenn Sie sie jedoch aus irgendeinem Grund dekodieren müssen, gehen Sie base64zum Ende der Pipe. Es werden dann 5 Zeichen aus urandom gesammelt und base64 codiert mit der richtigen Polsterung, aber die letzte Zeichenfolge ist möglicherweise länger als gewünscht, da die Polsterung erfolgt.

cat /dev/urandom | head -c 5 | base64
Umur Kontacı
quelle
Dies ist nicht genau das, wonach die Frage gestellt wurde. Ihre Antwort mag immer noch nützlich sein, aber die Frage hat nicht genug Kontext, um sicher zu sein.
Kasperd
1
@kasperd Die Frage fragt (im Titel), wie N zufällige Zeichen aus / dev / urandom gelesen werden sollen, aber im Text werden Bytes abgefragt. Ich stimme zu, dass es eine Inkonsistenz gibt. Ich bin auf diese Frage von Google zum Lesen von Zeichen gekommen und denke, dass sie den zukünftigen Besuchern als Option helfen kann.
Umur Kontacı
Ich denke, Ihre Antwort ist am einfachsten und doch am einfachsten zu verstehen. Vielen Dank!
Robert
1
Die Verwendung von catliest weit mehr als eine bestimmte Menge NZeichen und kann die Entropie erschöpfen. Nicht nützliche Antwort.
Dr. Beco
1
Während Dr. Beco zu Recht davon ausgeht, dass dies ein Missbrauch von catbeiden ist base64und headeinen Dateinamen als Argument nehmen kann, funktioniert dies in diesem Fall und sollte die Entropie nicht erschöpfen. Siehe stackoverflow.com/questions/10031344/…
J.Money,
11

Versuche dies: dd if=/dev/urandom bs=1 count=3

Wenn Sie das Ergebnis in $ variable schreiben wollen:

variable=`dd if=/dev/urandom bs=1 count=3`

Beachten Sie, dass es wahrscheinlich nicht druckbar sein wird.

Eduardo Ivanec
quelle
Kann der Befehl auch zum Lesen von 3 zufälligen Bytes von Binärdaten verwendet werden?
Dimitrios Desyllas
6

Die einfachste Lösung wäre so einfach wie:

$ head -cN /dev/urandom
Spack
quelle
2
Was trägt dies zu den bereits gegebenen Antworten bei?
MadHatter
5
einfacher
aufruf