Comment lire en N caractères aléatoires à partir de / dev / urandom?

50
read /dev/urandom 3

Ce qui précède ne fonctionne pas. Comment puis-je lire des octets aléatoires /dev/urandomdans bash?

linux
la source

Réponses:

44
random="$(dd if=/dev/urandom bs=3 count=1)"
Flimzy
la source
1
@ Flimzy, comment ça $()marche?
linux
2
Il traite la sortie d'une commande comme une variable. Note: C'est un bashisme. Si vous n'utilisez pas bash, vous devrez peut-être utiliser `` à la place. `` est plus universel, mais je pense que $ () est plus facile à lire.
Flimzy
@Flimzy, It treats the output of a command like a variable.vous voulez dire en tant que chaîne, n'est-ce pas?
Linux
2
Une variable peut être une chaîne ... ou un nombre. Il la traite comme une variable ... puis, en fonction du contexte, elle est traitée comme une chaîne ou un nombre.
Flimzy
1
$()est assez universel, pas spécifique à Bash. En passant, faites attention de ne pas rencontrer de limitations sur les caractères que le shell peut stocker dans les variables - par exemple, la version de bash que j'ai testée avec des valeurs nulles (\ x00) dans la chaîne.
Gordon Davisson
46
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(Si vous voulez des tirets littéraux, le tiret doit être placé à la fin de la chaîne, comme indiqué ci-dessus, par opposition à *-_).

Et pour expliquer ce qui est fait grâce à l'ensemble de commandes ci-dessus:

  1. head -c 500 /dev/urandom: Obtenir les 500 premiers caractères (octets) de /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Supprime tous les caractères spécifiés dans 'a-zA-Z0-9~!@#$%^&*_-'de la sortie de la première commande.
  3. fold -w 3: Formate la sortie de la deuxième commande de telle sorte qu'elle ait 3 caractères par ligne.
  4. head -n 1: Affiche la première ligne du résultat de la troisième commande sur stdout.
ADM
la source
1
Il cherche 3 octets ...
Chris S
1
3 plus modèle exact
ADM
C'est excellent.
Danijel-James W
3
Génial! Il existe également les noms de classe de caractères ([: graph | print | etc:]) disponibles pour la fonction tr, et cela pourrait être simplifié davantage en remplaçant le fold -w 3 | head -n 1par un head -c 3si le nouveau caractère de ligne n'est pas nécessaire à la fin.
Zimmi
5
Si le codage par défaut du système est multi-octets (par exemple UTF-8), alors tr échouera avec une Illegal byte sequenceerreur. Pour résoudre ce problème, utilisez le codage "C"; changez la commande en:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff
33

S'il vous plaît vérifier man od.

Vous pouvez utiliser, par exemple

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

générer des nombres aléatoires non signés de 4 octets non signés.

Ekrem Aksoy
la source
1
Ekrem, bienvenue à SF. Normalement, je ne privilégie pas beaucoup les nouvelles réponses à des questions acceptées depuis longtemps, mais c’est vraiment différent de toutes les réponses précédentes et présente de réels avantages - sympa! +1 de moi et j'espère que vous resterez près de SF et que vous contribuerez ainsi pendant un certain temps.
MadHatter soutient Monica le
19

En voici un qui crée des chaînes base64; notez que même si elles sont limitées à des chaînes base64, le remplissage leur est enlevé. Par conséquent, vous ne pouvez pas les décoder, vous n'en aurez probablement pas besoin de toute façon.

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

Remplacez-le 5par le nombre de caractères souhaité.

Si vous avez toutefois besoin de les décoder pour une raison quelconque, déplacez-vous base64jusqu'au bout du tuyau. Il va ensuite collecter 5 caractères d'urandom et base64 l'encoder avec le bon remplissage, mais la chaîne finale risque d'être plus longue que ce que vous vouliez en raison du remplissage.

cat /dev/urandom | head -c 5 | base64
Umur Kontacı
la source
Ce n'est pas exactement ce que la question demandait. Votre réponse pourrait quand même être utile, mais la question n’a pas assez de contexte pour en dire plus.
Kasperd
1
@kasperd La question demande (dans le titre) comment lire N caractères aléatoires dans / dev / urandom mais dans le corps, elle demande des octets de lecture. Je conviens qu'il y a une incohérence. Je suis venu à cette question de Google pour la lecture des caractères et je pense que cela pourrait aider les futurs visiteurs comme une option.
Umur Kontacı
Je pense que votre réponse est la plus simple mais la plus facile à comprendre. Merci!
Robert
1
Utiliser catlira beaucoup plus qu'une quantité donnée de Ncaractères, et peut épuiser l'entropie. Pas de réponse utile.
Dr Beco
1
Alors que le Dr Beco est exact que c'est un abus de catpuisque les deux base64et headpeut prendre un nom de fichier comme argument, dans ce cas , il fonctionne et ne doit pas appauvrir l'entropie. Voir stackoverflow.com/questions/10031344/…
J.Money
11

Essaye ça: dd if=/dev/urandom bs=1 count=3

Si vous voulez mettre le résultat dans $ variable:

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

Notez que ce ne sera probablement pas imprimable.

Eduardo Ivanec
la source
La commande peut-elle également être utilisée pour lire également 3 octets aléatoires de données binaires?
Dimitrios Desyllas
6

La solution la plus simple serait aussi simple que:

$ head -cN /dev/urandom
Spack
la source
2
Qu'est-ce que cela ajoute aux réponses déjà données?
MadHatter soutient Monica le
5
invocation plus simple
m.kocikowski