Come leggere in N caratteri casuali da / dev / urandom?


50
read /dev/urandom 3

Quanto sopra non funziona .. Come posso leggere byte casuali da /dev/urandomin bash?

Risposte:


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

1
@ Flimzy, come $()funziona?
Linux,

2
Tratta l'output di un comando come una variabile. Nota: questo è un bashismo. Se non stai usando bash, potresti dover usare `` invece. `` è più universale, ma penso che $ () sia più facile da leggere.
Flimzy,

@Flimzy, It treats the output of a command like a variable.intendi davvero come stringa, giusto?
Linux,

2
Una variabile può essere una stringa ... o un numero. Lo tratta come una variabile ... quindi, a seconda del contesto, viene trattato come una stringa o un numero.
Flimzy,

1
$()è piuttosto universale, non specifico per bash. A proposito, fai attenzione a non incorrere in limitazioni su quali caratteri la shell può memorizzare in variabili - ad esempio, la versione di bash che ho testato lascia nulli (\ x00) dalla stringa.
Gordon Davisson,

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

(Se vuoi caratteri di trattino letterali, il carattere di trattino deve andare alla fine della stringa come fatto sopra, al contrario di *-_).

E per spiegare cosa viene fatto grazie al set di comandi sopra:

  1. head -c 500 /dev/urandom: Ottiene i primi 500 caratteri (byte) da /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Rimuove tutti i caratteri tranne quelli specificati 'a-zA-Z0-9~!@#$%^&*_-'dall'output del primo comando.
  3. fold -w 3: Formatta l'output del secondo comando in modo che contenga 3 caratteri per riga.
  4. head -n 1: Visualizza la prima riga del risultato del terzo comando stdout.

1
Sta cercando 3 byte ...
Chris S,

1
3 più modello esatto
ADM

Questo è eccellente
Danijel-James W,

3
Grande! Ci sono anche i nomi delle classi di caratteri ([: graph | print | etc:]) disponibili per la funzione tr, e potrebbe essere ulteriormente semplificato sostituendo fold -w 3 | head -n 1con un head -c 3se il nuovo carattere di riga non è necessario alla fine.
Zimmi,

5
Se la codifica predefinita del sistema è multibyte (ad es. UTF-8), tr avrà esito negativo con un Illegal byte sequenceerrore. Per risolvere il problema, utilizzare la codifica "C"; cambia il comando in:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff

33

Per favore, controlla man od.

Puoi usare, per esempio

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

per generare numeri casuali decimali senza segno di 4 byte.


1
Ekrem, benvenuto in SF. Normalmente non preferisco di gran lunga nuove risposte a domande accettate da tempo, ma questo è veramente diverso da tutte le risposte precedenti e presenta alcuni vantaggi reali: bello! +1 da me, e spero che tu rimanga vicino a SF e contribuisca in questo modo per qualche tempo a venire.
MadHatter supporta Monica il

19

Eccone uno che crea stringhe base64, nota che sebbene siano limitate alle stringhe base64, il padding viene rimosso da esse, quindi non puoi decodificarle, probabilmente non ti serviranno comunque.

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

Sostituisci 5con il numero di caratteri che desideri.

Se, tuttavia, è necessario decodificarli per qualche motivo, spostarsi base64alla fine della pipe. Quindi raccoglierà 5 caratteri da urandom e base64 lo codificherà con il giusto riempimento, ma la stringa finale potrebbe essere più lunga di quella che volevi a causa del riempimento.

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

Questo non è esattamente ciò che la domanda stava ponendo. La tua risposta potrebbe essere ancora utile, ma la domanda non ha abbastanza contesto per dirlo con certezza.
Kasperd,

1
@kasperd La domanda pone (nel titolo) come leggere N caratteri casuali da / dev / urandom ma nel corpo chiede la lettura di byte. Sono d'accordo che ci sia un'incoerenza. Sono arrivato a questa domanda da Google per la lettura dei personaggi e penso che possa aiutare i futuri visitatori come opzione.
Umur Kontacı

Penso che la tua risposta sia la più semplice ma più facile da capire. Grazie!
Robert,

1
L'utilizzo catleggerà molto più di un determinato numero di Ncaratteri e può esaurire l'entropia. Risposta non utile
Dr Beco,

1
Mentre il dott. Beco ha ragione sul fatto che si tratta di un abuso di catentrambi base64e headpuò prendere un nome di file come argomento, in questo caso funziona e non dovrebbe esaurire l'entropia. Vedere stackoverflow.com/questions/10031344/...
J.Money

11

Prova questo: dd if=/dev/urandom bs=1 count=3

Se vuoi mettere il risultato in $ variabile:

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

Nota che probabilmente non sarà stampabile.


Il comando può essere utilizzato anche per leggere anche 3 byte casuali di dati binari?
Dimitrios Desyllas,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.