|
|
|
|
||||||
| fr.comp.os.unix Système UNIX. |
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour,
je cherche a ecrire des caracteres depuis leur equivalent hexadecimal en shell. par exemple partir de 5A qui represente Z en ASCII comment faire? Ensuite est il possible pour un script shell de generer 8 caracteres compris dans la tranche ASCII 0x20 .. 0x126 ? (l'idee est d'en faire un generateur de mot de passe aleatoire) Merci |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
octane@alinto.com :
> Ensuite est il possible pour un script shell de generer 8 caracteres > compris dans la tranche ASCII 0x20 .. 0x126 ? ^^^^^ Tu veux dire «0x7E», j'imagine? > (l'idee est d'en faire un generateur de mot de passe aleatoire) A=`dd bs=N count=1 </dev/urandom | mimencode` echo "${A%%=*}" pour un certain N. Bon d'accord, les caractères ne sont choisis que parmi 64 caractères sur 95. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On 2 May 2006 06:37:41 -0700, octane@alinto.com wrote:
> Bonjour, > > je cherche a ecrire des caracteres depuis leur equivalent hexadecimal > en shell. > > par exemple partir de 5A qui represente Z en ASCII perl -e 'printf "%c\n", 0x5A' Avec certains dc: echo 16i 5A ap | dc POSIXement: oct=$(echo 'ibase=16; obase=8; 5A' | bc) printf '%b\n' "\0$oct" > Ensuite est il possible pour un script shell de generer 8 caracteres > compris dans la tranche ASCII 0x20 .. 0x126 ? [...] perl -le 'srand(); print pack "C*", map {rand(95)+32} 1..8' POSIXement: awk ' BEGIN { srand() for (i = 0; i < 8; i++) printf "%c", rand() * 95 + 32 print "" }' -- Stephane |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
lhabert@clipper.ens.fr (Luc Habert) writes:
> octane@alinto.com : > >> Ensuite est il possible pour un script shell de generer 8 caracteres >> compris dans la tranche ASCII 0x20 .. 0x126 ? > ^^^^^ > Tu veux dire «0x7E», j'imagine? > >> (l'idee est d'en faire un generateur de mot de passe aleatoire) > > A=`dd bs=N count=1 </dev/urandom | mimencode` > echo "${A%%=*}" > > pour un certain N. Bon d'accord, les caractères ne sont choisis que parmi 64 > caractères sur 95. Oui, mais là, tu utilises dd. C'est de la triche, on demandait un script shell, pas un dd... #!/bin/bash chars=' !\"#$%&'\''()*+,-./0123456789:;<=>?' chars="$chars"'@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' chars="$chars"'\`abcdefghijklmnopqrstuvwxyz\{\|\}\ ~' echo -n 'Generated: ' i=0 ; while [ $i -lt 8 ] ; do echo -n "${chars:$(( $RANDOM % ( 1 + ${#chars} ) )):1}" # I know about print, but it's an external program. i=$(( $i + 1 )) done echo '' -- __Pascal Bourguignon__ http://www.informatimago.com/ PLEASE NOTE: Some quantum physics theories suggest that when the consumer is not directly observing this product, it may cease to exist or will exist only in a vague and undetermined state. |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
Pascal Bourguignon a écrit :
> Oui, mais là, tu utilises dd. C'est de la triche, on demandait un > script shell, pas un dd... > > #!/bin/bash > chars=' !\"#$%&'\''()*+,-./0123456789:;<=>?' > chars="$chars"'@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' > chars="$chars"'\`abcdefghijklmnopqrstuvwxyz\{\|\}\ ~' > echo -n 'Generated: ' > i=0 ; while [ $i -lt 8 ] ; do > echo -n "${chars:$(( $RANDOM % ( 1 + ${#chars} ) )):1}" > # I know about print, but it's an external program. > i=$(( $i + 1 )) > done > echo '' > Parfait. Merci |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
On 4 May 2006 01:57:21 -0700, octane@alinto.com wrote:
> Pascal Bourguignon a écrit : >> Oui, mais là, tu utilises dd. C'est de la triche, on demandait un >> script shell, pas un dd... >> >> #!/bin/bash >> chars=' !\"#$%&'\''()*+,-./0123456789:;<=>?' >> chars="$chars"'@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' >> chars="$chars"'\`abcdefghijklmnopqrstuvwxyz\{\|\}\ ~' >> echo -n 'Generated: ' >> i=0 ; while [ $i -lt 8 ] ; do >> echo -n "${chars:$(( $RANDOM % ( 1 + ${#chars} ) )):1}" >> # I know about print, but it's an external program. La commande "print" quand elle est externe est plus generalement une commande pour imprimer. Sinon, c'est un builtin de ksh ou zsh. C'est printf qu'il faut utiliser, qui est standard et portable et interne a bash et a la plupart des sh POSIX/Unix. >> i=$(( $i + 1 )) >> done >> echo '' >> > Parfait. Merci A noter que la solution ci-dessus n'est ni standard, ni portable (ya des bashs qui ne reconnaissent pas -n, ni tres lisible, ni correcte (le backslash se retrouve une dixaine de fois, le calcul avec $RANDOM n'est pas correct. Et la distribution de $((RANDOM % <tout-nombre-qui-n'est-pas-une-puissance-de-deux)) n'est pas uniforme. A comparer avec: awk ' BEGIN { srand() for (i = 0; i < 8; i++) printf "%c", rand() * 95 + 32 print "" }' Qui est non seulement correct mais portable, non seulement sur les systemes conformes a la norme Unix, mais aussi a la norme POSIX (portable OS interface). -- Stephane |
|
![]() |
| Outils de la discussion | |
|
|