OVH Cloud OVH Cloud

manipuler des chaines de caracteres

5 réponses
Avatar
octane
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

5 réponses

Avatar
lhabert
:

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.

Avatar
Stephane Chazelas
On 2 May 2006 06:37:41 -0700, 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 "%cn", 0x5A'

Avec certains dc:

echo 16i 5A ap | dc

POSIXement:

oct=$(echo 'ibase; obase=8; 5A' | bc)
printf '%bn' "$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

Avatar
Pascal Bourguignon
(Luc Habert) writes:

:

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.


Avatar
octane
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


Avatar
Stephane Chazelas
On 4 May 2006 01:57:21 -0700, wrote:
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