Was ist der beste Weg, um eine zufällige (ish) Folge von druckbaren / alphanumerischen Zeichen zu erhalten?

1384
einpoklum

Ich weiß, dass ich zufällige (naja, pseudo-zufällige) Zeichen ohne Einschränkung von '/dev/random'(oder /dev/urandom) erhalten kann. Was aber, wenn ich diese Zeichen brauche, um einen Dateinamen zu generieren? Ich muss irgendwie einen Stream oder eine Folge von druckbaren oder alphanumerischen Zeichen haben, um auf der sicheren Seite zu sein. Was ist der beste Weg, dies in der Shell zu tun?

(Ich weiß, dass ich theoretisch ein trZeichen auf Zeichen setzen könnte, /dev/randomaber das hört sich nicht nach dem richtigen an.)

1
Vielleicht möchten Sie den Befehl `mktemp` betrachten, es sei denn, Sie müssen wirklich nur einen Namen generieren, ohne eine Datei mit diesem Namen zu erstellen. chepner vor 11 Jahren 1
@chepner: Das ist eine großartige Lösung für mein motivierendes Problem, danke! Leider habe ich nicht danach gefragt ... einpoklum vor 11 Jahren 0
Konvertieren Sie die Ausgabe von urandom in druckbar. Oder lesen Sie es weiter und geben Sie nur die im druckbaren Bereich aus. Matt H vor 11 Jahren 0

3 Antworten auf die Frage

2
Nevin Williams

Ich sehe, /usr/bin/jotist in der Lage, eine bestimmte Anzahl von zufälligen zufälligen Zeichen zu ergänzen, die in ein Wort umgewandelt werden können, das für einen Dateinamen geeignet ist. Es gibt wahrscheinlich eine eloquentere Art, alle druckbaren Zeichen anzugeben, aber bei meiner Shell-Skripterstellung bin ich ein bisschen verrostet.

[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g EUCGGSIOIDMPCHXCHIGYXBYWJ [mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g PMKQQZOCYETVIHIMTIQFYTFZK [mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g CXBKEFSIRCOOGUICJPOMZKMSG [mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g MEHSFOSHLKKJRKQLRCXUCBJAD [mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g ZCCGKYIWLBTJUVIHQBCHXCVEU 
Das ist ganz nett ... natürlich müssen Sie `jot` installiert haben und ich glaube nicht, dass es standardmäßig installiert ist (zumindest nicht auf Debian-Systemen). einpoklum vor 11 Jahren 0
Es scheint eine BSD-Sache zu sein ... Wie Sie bereits erwähnt haben, wenn Sie den generierten Text für einen Dateinamen verwenden (Sie möchten ihn jedoch generieren), möchten Sie möglicherweise mit einem ausreichend genauen Zeitstempel versehen, so dass es unwahrscheinlich ist, dass er abgerufen wird dieselbe zufällige Zeichenfolge mehr als einmal, Sie haben immer noch einen eindeutigen Dateinamen. Nevin Williams vor 11 Jahren 1
1
dawud

$ dd if=/dev/urandom of=/dev/stdout bs=124 count=1 2>/dev/null | sha256sum | awk ''

1
einpoklum

A tweaking of @dawud's solution:

dd if=/dev/urandom bs=124 count=1 2>/dev/null | sha256sum | cut -c1-64 

gets you 64 characters; and you can use /dev/random on UN*X systems without /dev/urandom.

A different, simpler approach, based on @NevinWilliam's suggestion: just do

date +%s.%N 

No alphabet characters is a special case of alphanumeric... this doesn't cover the whole range of possible strings, and is limited to 9 characters, and it's not very random - except maybe the last 2-4 digits or so - but since we're not doing crypto, this should be good enough.