Frage Wie lies ich N zufällige Zeichen aus / dev / urandom ein?


read /dev/urandom 3

Das obige funktioniert nicht. Wie kann ich zufällige Bytes lesen? /dev/urandom in der bash?


38
2018-06-23 05:34


Ursprung




Antworten:


random="$(dd if=/dev/urandom bs=3 count=1)"

37
2018-06-23 05:44



@ Flimzy, wie geht es $() Arbeit? - linux
Es behandelt die Ausgabe eines Befehls wie eine Variable. Hinweis: Das ist ein Bashismus. Wenn Sie bash nicht verwenden, müssen Sie stattdessen `` verwenden. `` ist universeller, aber ich denke $ () ist leichter zu lesen. - Flimzy
@ Flimzy,It treats the output of a command like a variable.Du meinst eigentlich als String, oder? - linux
Eine Variable können Sei eine Zeichenfolge ... oder eine Zahl. Es behandelt es als eine Variable ... dann wird es je nach Kontext wie eine Zeichenfolge oder eine Zahl behandelt. - Flimzy
$() ist ziemlich universal, nicht bash-spezifisch. Übrigens, seien Sie vorsichtig, wenn Sie nicht auf Einschränkungen stoßen, welche Zeichen die Shell in Variablen speichern kann - zum Beispiel lässt die Version von Bash, die ich getestet habe, Nullen (\ x00) aus der Zeichenfolge aus. - Gordon Davisson


head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

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

Und um zu erklären, was aufgrund der obigen Befehle gemacht wird:

  1. head -c 500 /dev/urandom: Erhalte die ersten 500 Zeichen (Bytes) von /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Löschen alle aber die in angegebenen Zeichen 'a-zA-Z0-9~!@#$%^&*_-' von der Ausgabe des ersten Befehls.
  3. fold -w 3: Formatieren Sie die Ausgabe des zweiten Befehls so, dass sie 3 Zeichen pro Zeile enthält.
  4. head -n 1: Zeigen Sie die erste Zeile des Ergebnisses des dritten Befehls an stdout.

37
2018-02-21 16:41



Er sucht nach 3 Bytes ... - Chris S
3 plus genaues Muster - ADM
Das ist ausgezeichnet. - Danijel-James W
Großartig! Es gibt auch die Namen der Char - Klassen ([: graph | print | etc:]), die für das tr func verfügbar sind, und es könnte weiter vereinfacht werden, indem man das fold -w 3 | head -n 1 durch eine head -c 3 wenn das neue Zeilenkürzel am Ende nicht benötigt wird. - Zimmi
Wenn die Standardcodierung des Systems Multibyte ist (z. B. UTF-8), schlägt tr mit einem Fehler fehl Illegal byte sequence Error. Um das zu beheben, verwenden Sie die Codierung "C"; Ä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


Bitte prüfe man od.

Sie können zum Beispiel verwenden

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

um vorzeichenlose 4-Byte-Zufallszahlen zu erzeugen.


23
2017-09-01 07:18



Ekrem, willkommen in SF. Normalerweise favorisiere ich keine neuen Antworten auf lang akzeptierte Fragen, aber das ist wirklich anders als alle vorherigen Antworten und hat einige echte Vorteile - nett! +1 von mir, und ich hoffe, du bleibst in SF und trägst so für einige Zeit dazu bei. - MadHatter


Hier ist eine, die Base64-Strings erstellt, beachten Sie, dass, obwohl sie auf Base64-Strings beschränkt sind, das Padding von ihnen entfernt wird, so dass Sie sie nicht decodieren können, Sie werden es wahrscheinlich sowieso nicht brauchen.

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

Ersetzen 5 mit der Anzahl der Zeichen, die Sie möchten.

Wenn Sie sie jedoch aus irgendeinem Grund entschlüsseln müssen, bewegen Sie sich base64 bis zum Ende der Pfeife. Es wird dann 5 Zeichen von Urandom sammeln und Base64 es mit der richtigen Polsterung codieren, aber die endgültige Zeichenfolge kann länger als das, was Sie wegen der Polsterung wollten.

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

17
2018-01-04 06:34



Dies ist nicht genau das, wonach die Frage gefragt wurde. Ihre Antwort könnte immer noch nützlich sein, aber die Frage hat nicht genug Kontext, um es mit Sicherheit zu sagen. - kasperd
@ Kasperd Die Frage fragt (im Titel), wie man N zufällige Zeichen von / dev / urandom liest, aber im Körper bittet es um das Lesen von Bytes. Ich stimme zu, dass es eine Inkonsistenz gibt. Ich bin auf diese Frage von Google gekommen, um Zeichen zu lesen, und ich denke, dass es zukünftigen Besuchern als eine Option helfen kann. - Umur Kontacı
Ich denke deine Antwort ist am einfachsten, aber am einfachsten zu verstehen. Vielen Dank! - Robert
Verwenden cat liest viel mehr als eine bestimmte Menge N Zeichen, und kann die Entropie erschöpfen. Nicht nützliche Antwort. - Dr Beco
Während Dr. Beco richtig ist, ist dies ein Missbrauch von cat seit beiden base64 und head kann einen Dateinamen als Argument nehmen, in diesem Fall funktioniert es und sollte die Entropie nicht erschöpfen. Sehen stackoverflow.com/questions/10031344/... - J.Money


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 ist.


9
2018-06-23 05:43



Kann der Befehl auch verwendet werden, um auch 3 zufällige Bytes von Binärdaten zu lesen? - Dimitrios Desyllas


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

$ head -cN /dev/urandom

4
2017-09-01 08:00



Was fügt dies den bereits gegebenen Antworten hinzu? - MadHatter
einfacherer Aufruf - m.kocikowski