Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 21/02/2010, à 00:56

nesthib

[JEU] challenge bash #4

1265482796.png

[informations sur le jeu]

<<    challenge bash #4   >>

génération d'un mot de passe

le challenge consiste à réaliser un script capable de générer un mot de passe aléatoire. Attention à la simplicité apparente du challenge, devant le grand nombre de méthodes disponibles nous serons très critiques quand à la qualité du script, son originalité et son utilisabilité (méthode de génération du mot de passe, options du script, …)

contrainte : le mot de passe doit pouvoir comporter minuscules / MAJUSCULES / caractères spéciaux : $%!-#~"*'[]?@,.;

Soyez d'autant plus attentifs que ce challenge est le premier d'une série de 3 challenges imbriqués !


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#2 Le 21/02/2010, à 01:31

nesthib

Re : [JEU] challenge bash #4

solution de sputnick :

#!/usr/bin/env bash
#
# ------------------------------------------------------------------
#	 made by sputnick in da FreAkY lApPy lAb (c) 2009
# 	 gilles.quenot <AT> gmail <DOT> com
#
#    This program is free software; you can redistribute it and/or
#    modify it under the terms of version 2 of the GNU General Public
#    License published by the Free Software Foundation.
#	 	(see http://www.gnu.org/licenses/gpl.html).
#
# ------------------------------------------------------------------
#   ,,_
#  o"  )@
#   ''''
# ------------------------------------------------------------------
# vim:ts=4:sw=4
#
# password-generator.bash comme son nom l'indique, génère un mot de passe alleatoire
#   en se servant de la table ASCII en decimale.
# ( On convertit le nombre decimal en octal pour l'affichage ).
# Par defaut sans arguments, on affiche un mot de passe avec des caracteres 
#   alphanumeriques d'une longueur de 7 caracteres.
# Pour afficher des caracteres speciaux on utilise le flag -s comme Special.
# Pour definir de façon arbitraire la longueur du mot de passe, on utilise le flag -l

while getopts "l:sh" opt; do
	case $opt in
		l) len=$OPTARG ;;
		s) cas=ALL ;;
		*) printf "Usage :\n\t${0##*/} [-l <N>] [-sh]\n\nSyntax:\n\t-l\tlength integer\n\t-s\tadd special caracters\n\t-h\tthis help\n"; exit 1 ;;
	esac
done

ALNUM="{48..57} {65..90} {97..122}" ALL="{33..126}" cas=${cas:=ALNUM} ARR=( $(eval echo ${!cas}) ) arrcount=${#ARR[@]} len=${len:-7}

for ((i=0; i<len; i++)); do printf \\$(printf '%03o' ${ARR[RANDOM%arrcount]}); done; echo

solution de Totor :

#!/bin/bash

myHelp()
{
	[ $# -ne 0 ] && echo >&2 -e  "$@"
	cat >&2 <<EOF
	Usage : ${0##*/} [[-c <key=value>] ...] [[-q <key=value>]...] [[-u <key=value>] ...] [-n <number>] [-d]

	Options:
	-c : Définition d'une classe (jeux de caractères)
	-q : Indique la quantité de caractères de la classe devant être présents dans le mot de passe (nombre >=0)
	-u : Indique si les caractères de la classe peuvent être en doublon dans le mot de passe (1 : unique; <>1 : doublon autorié)
	-d : Utilise le device /dev/urandom plutôt que la variable bash RANDOM
	-n : Nombre de mot de passe à générer (1 par défaut)

	Valorisation:
	key : indentifiant numérique de la classe (>=0)
	value : valeur de l'option pour la classe donnée


	Classes:
	Il existe 4 classes definies par défaut :
	0 : ${charsMin}
	1 : ${charsMaj}
	2 : ${charsDig}
	3 : ${charsSpe}

	Si l'option -c est utilsée avec une "key" ayant une valeur déjà définie alors la classe correspondante est écrasée.
	Si un caractère est commun à deux classes, la géneration du mot de passe n'a pas lieu.


	Quantités et unicités :
	La quantité par defaut est 2.
	L'unicité par defaut est 1 (donc un caractère ne peut être en doublon).
EOF
	[ $# -ne 0 ] && exit 1
	exit 0
}

# suppression des espaces ajoutés par la commande {X..Y}
deleteSpaces()
{
	chars="$@"
	echo "${chars// }"
}

# Ajoute le caractère d'échappement avant tous les caractères de la chaine passée en paramètre
getPattern()
{
	pattern=""
	for((idx=0;idx<${#1};idx++))
	do
	  pattern="${pattern}\\${1:${idx}:1}"
	done
	echo "${pattern}"
}

# verification du format key=valeur
verifOptionValue()
{
	def="$1"
	txt="$2"

	[[ "${def}" != *=* ]] && myHelp "Valeur non valide pour l'option ${option} : ${def}"

	id="${def%%=*}"
	value="${def#*=}"
	# test de la valeur de id
	ID="${id}"
	( ((id*=1)) || ((id==0)) )  && ((id>=0)) || myHelp "Identifiant non valide ${txt} : ${ID}"

	nomTab="tab${id}"
	
	# si la classe n'existait pas, on définit les valeur par défaut pour le nom du tablea, la quantité et l'unicité
	
	[ ! "${tabTab[${id}]}" ] && { 
		tabTab[${id}]="${nomTab}"
		eval "${nomTab}=\"\""
	}
	[ ! "${tabUnq[${id}]}" ] && tabUnq[${id}]=${defaultUnq}
	[ ! "${tabQte[${id}]}" ] && tabUnq[${id}]=${defaultQte}
}

# definition d'une classe depuis une valeur passée à l'option -c  en ligne de commande
setClass()
{
  verifOptionValue "$1" "de classe"
  
  # on definie le nom dans le tableau  
  tabTab[${id}]="${nomTab}"
  # valorisation de la liste des caractère de la classe

  eval "${nomTab}=\"${value}\""
}

# définitition d'une quantité de caractère à inclure dans le password depuis une valeur passée à option -q de la ligne de commande
setQte()
{
	verifOptionValue "$1" "de quantité"
	
	val="${value}"	
	( ((value*=1)) || ((value==0)) ) && ((value>=0)) || myHelp "Quantité non valide pour l'id ${id} : ${val}"
	
	tabQte[${id}]="${value}"
}

# définitition d'une quantité de caractère à inclure dans le password depuis une valeur passée à option -q de la ligne de commande
setUnq()
{
	verifOptionValue "$1" "d'unicité"
	
	val="${value}"
	( ((value*=1)) || ((value==0)) ) && ((value>=0)) || myHelp "Unicitée non valide pour l'id ${id} : ${val}"
	
	tabUnq[${id}]="${value}"
}

# generation du password
genPwd()
{
	pwd=""
	allChars=""
	tabChars=()

	for((index=0;index<${#tabTab[@]};index++))
	do
		chars=""
		[ ${tabQte[${index}]} -lt 0 ] && tabQte[${index}]=0
		[ ${tabQte[${index}]} -ne 0 ] && {
			nomTab="${tabTab[${index}]}"
			chars="${!nomTab}"
			tabChars[${index}]="${chars}"
			allChars="${allChars}${chars}"
			[ ${tabQte[${index}]} -gt ${#chars} ] &&  [ ${tabUnq[${index}]} -eq 1 ] && tabQte[${index}]=${#chars}
		}
		[ ! "${chars}" ] && tabQte[${index}]=0
		tabRes[${index}]=tabQte[${index}]
	done

	length="${tabQte[@]}"
	length="${length// /+}"
	length=$((${length}))

	while [ ${#pwd} -lt ${length} ];
	do
		# commenter pour ne pas utiliser le device /dev/urandom
		${useRandom} && {
			index=$((${#allChars}*${RANDOM}/32768))
			char="${allChars:${index}:1}"
		} || IFS="" read -n1 char < /dev/urandom

		[ "${allChars}" ] && pattern="$(getPattern "${allChars}")" || char=""

		char="${char/[^${pattern}]}"

		[ "${char}" ] && {
			# recherche du tableau auquel appartient le caractere
			for ((index=0; index<${#tabTab[@]}; index++))
			do
			[ "${tabChars[${index}]}" ] && {
				# il y a des caractères dans cette classe, on peut la vérifier
				pattern="$(getPattern "${tabChars[${index}]}")"
				[ "${char//[^${pattern}]}" ] && {
					# on a trouve le tableau
					# on peut rajouter le caractère au mot de passe car il reste au moins 1 caractère de cette classe à positionner dans le pwd
					pwd="${pwd}${char}"
					# on décrémente le nombre de caractères restant à ajouter pour cette classe
					tabRes[${index}]=$((${tabRes[${index}]}-1))

					[ ${tabUnq[${index}]} -eq 1 ] && {
						# le caractère ne doit être présent qu'une seule fois, on le supprime donc des caractères autorisés
						unChar="\\${char}"
						tabChars[${index}]="${tabChars[${index}]//${unChar})}"
						allChars="${allChars//${unChar}}"
					}

					[ ${tabRes[${index}]} -eq 0 ] && {
						# on ne peut plus mettre de caractères de cette classe, on supprime donc tous les caractères de cette classe à ceux autorisés
						pattern="$(getPattern "${tabChars[${index}]}")"
						allChars="${allChars//[${pattern}]}"
						tabChars[${index}]=""
					}
				}
			}
			done
		}
	done
	echo "${pwd}"
}

# verification ne caractères en commun entre 2 classes
verifClass()
{
	for ((index=0;index<$((${#tabTab[@]}-1));index++))
	do
		nomTab="${tabTab[${index}]}"
		chars="${!nomTab}"
		for((idx=$((index+1)); idx<${#tabTab[@]};idx++))
		do
			nomTab="${tabTab[${idx}]}"
			charsT="${!nomTab}"
			pattern="$(getPattern "${charsT}")"
			[[ "${chars}" == *[${pattern}]* ]] && myHelp "Des caractères sont en communs entre deux classes : \n\tclasse n°${index}=${chars}\n\tclasse n°${idx}=${charsT}"
		done
	done
}

# tableau des caractères autorisés
charsMin="$(deleteSpaces {a..z})"
charsMaj="$(deleteSpaces {A..Z})"
charsDig="$(deleteSpaces {0..9})"
charsSpe="$ %~*'[]?@;.><()\"!"

defaultQte=2
defaultUnq=1
nbPwd=1

# tableau contenant la liste des tableaux
tabTab=( charsMin charsMaj charsDig charsSpe )
tabQte=( ${defaultQte} ${defaultQte} ${defaultQte} ${defaultQte} )
tabUnq=( ${defaultUnq} ${defaultUnq} ${defaultUnq} ${defaultUnq} )

userRandom=true
while getopts :c:q:u:n:dh option
do
  case "${option}" in
    c) setClass "${OPTARG}";;
    q) setQte "${OPTARG}";;
    u) setUnq "${OPTARG}";;
    d) useRandom=false;;
	n) nbPwd="${OPTARG}"
		((nbPwd*=1)) && ((nbPwd>=1)) || myHelp "Nombre de mot de passe à générer non valide : ${OPTARG}";;
    h) myHelp; exit;;
    :) myHelp "Argument manquant pour l'option '${OPTARG}'";;
    ?) myHelp "Option non valide : ${OPTARG}.";;
  esac
done

verifClass

for((cpt=1;cpt<=${nbPwd};cpt++))
do
	genPwd
done

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#3 Le 21/02/2010, à 01:47

n3o51

Re : [JEU] challenge bash #4

donc une ligne en perl ça compte pas big_smile

je sais ou es la sortie <===

Dernière modification par n3o51 (Le 21/02/2010, à 01:47)


Welcome to the real world
________________________________

Hors ligne

#4 Le 21/02/2010, à 01:54

nesthib

Re : [JEU] challenge bash #4

@n3o51 : fais comme tu veux smile après à nous de juger (mais on ne sait jamais, et puis tu peux proposer plusieurs solutions…)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#5 Le 21/02/2010, à 02:25

n3o51

Re : [JEU] challenge bash #4

Effectivement mais cela n'inclus aucune option big_smile

ça génère un passe de 10 caractères

perl -e '@pass=("A".."Z",0..9,"a".."z");print join("",@pass[map{rand @pass}(1..10)])'

résultat :

0JB9RgrLJa

Welcome to the real world
________________________________

Hors ligne

#6 Le 21/02/2010, à 02:30

nesthib

Re : [JEU] challenge bash #4

et les caractères spéciaux ?


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#7 Le 21/02/2010, à 02:36

Yannou90

Re : [JEU] challenge bash #4

Bonsoir (rebonsoir wink )
Methode gros tricheur :

pwgen -s -y -1 20 1

ce qui donne:

]c>!5CP"ZN@taeF&zCU=

Donc , pour que les choses soient clair , il faut produire un script equivalent a l'utilisation de pwgen ?!?
Il va me falloir 2/3 bassines de caféine , une perfusion , et un cendrier maousse costos comme dirait l'autre !!

Dernière modification par Yannou90 (Le 21/02/2010, à 21:58)

Hors ligne

#8 Le 21/02/2010, à 05:28

nicolas66

Re : [JEU] challenge bash #4

Bon, je me lance même s'il me paraît évident qu'on puisse faire plus court :

#!/bin/bash
###########################################################################
# Filename    : random_string.sh                                          #
# Description : generates a random string of given length                 #
# Author      : nicolas66                                                 #
# Last release: 21-02-2010                                                #
###########################################################################

###### Functions ######
function usage()
{
	local COMMAND="`basename $0` [-n] [-d] [-s] length"

cat << EOF
usage: ${COMMAND}

generates a random string of given length

OPTIONS:

 -n  string length (default 10)
 -d  use digits (default no)
 -s  use special chars (default no)
 -h  show this message
EOF
}

######### Core ########
# Variables
USE_DIGITS="no"
USE_SPECIAL_CHARS="no"
STR_LENGTH=10

# We parse input arguments
while getopts "hdsn:" OPT
do
	case "${OPT}" in
		h)
			usage && exit 0;;
		d)
			USE_DIGITS="yes";;
		s)
			USE_SPECIAL_CHARS="yes";;
		n)
			STR_LENGTH="${OPTARG}";;
		\?)
			usage && exit 1;;
	esac
done

# We check if the string length is a valid integer
if ! grep -q "^[1-9][0-9]*$" <<< ${STR_LENGTH}; then
	echo "error: the string length must be a strictly positive integer"
	exit 1
fi

# We generate a random string
chars="A-Za-z"

[ ${USE_DIGITS} = "yes" ] && chars="${chars}0-9"
[ ${USE_SPECIAL_CHARS} = "yes" ] && chars="${chars}~\"#'{([-|\`_\\^@])=+}\$%*!?,;./"

cat /dev/urandom | tr -dc "${chars}" | head -c ${STR_LENGTH}

exit 0

EDIT 1 : rajout de deux options
EDIT 2 : corrections de nesthib, ajout de caractères spéciaux

Dernière modification par nicolas66 (Le 21/02/2010, à 23:05)


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne

#9 Le 21/02/2010, à 05:34

Yannou90

Re : [JEU] challenge bash #4

Bon ben vite fait et a corriger :

#!/bin/bash

OPT_PASS=$1
RAND_PASS=
NBR_PASS=10
MAJ_PASS='A-Z'
MIN_PASS='a-z'
SPE_PASS='~"#{([-|`_\'

PERSO_PASS()
{
printf "Définissez les caractères\n"
read RAND_PASS
}

MAN_PASS()
{
printf "Utilisation : [script] [-nMmsp]\n-n=Nombre de caractères\n-M=Majuscule\n-m=Minuscule\n-s=Caractères spéciaux\n-p=Caractères définis par l'utilisateur\n-h=Afficher les options disponibles\n"
}

if [ $# = 0 ]
then
MAN_PASS
exit 1
fi

while getopts ":nMmsp" OPT_PASS
  do
	case "$OPT_PASS" in
	n )
	printf "Nombre de caractères du mot de passe\n"; read NBR_PASS;;
    	M )
    	RAND_PASS=$RAND_PASS$MAJ_PASS;;
    	m )
    	RAND_PASS=$RAND_PASS$MIN_PASS;;
    	s )
    	RAND_PASS=$RAND_PASS$SPE_PASS;;
    	p )
    	PERSO_PASS;;
    	h )
    	MAN_PASS;;
    	* )
    	MAN_PASS;;
	esac
done
grep -a -o "[$RAND_PASS]" /dev/urandom | tr -d "\n" | head -c "$NBR_PASS"
echo
exit

Par contre 2 tiot soucis (je trouverais pourquoi et comment wink

-Je me suis inspirer du script de AnsuzPeorth (http://forum.ubuntu-fr.org/viewtopic.php?pid=3275745#p3275745) pour getopts mais j'ai une erreur avec grep ?!
-J'ai essayer d'inclure tout les caracteres que j'ai trouver mais cela ne fonctionnait pas j ai encore du mal avec ces bêbête , j'ai donc reduit le nombre de caractere et oh surprise,sans les mettres tous ils apparaissent dans le resultat ?!?
La syntaxe employée permet elle alors l'utilisation de TOUT les caracteres speciaux ?

Hors ligne

#10 Le 21/02/2010, à 12:47

nesthib

Re : [JEU] challenge bash #4

@nicolas66 :

! echo "${STR_LENGTH}" | grep -q "^[1-9][0-9]*$"

n'est pas très habile et peut être remplacé par :

! grep … <<<${STR_LENGTH}

ou encore mieux

[ ${STR_LENGTH} -gt 0 ] 2>/dev/null

--------------------------------

for k in `seq 1 ${STR_LENGTH}`

par

for ((k=1 ; k<=${STR_LENGTH} ; k++))

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#11 Le 21/02/2010, à 13:10

Yannou90

Re : [JEU] challenge bash #4

Edit:Bon j'ai modifié mon script et compris d'où venaient ces caractères , suis-le bête des fois !

Bonjour

Apres m'être arraché la moitié des cheveux j'ai quelque chose qui tiend a peu près la route !

Utilisation :
[script] [-nMmspc] [defaut=-Mmsc]
-M=Majuscule
-m=Minuscule
-s=Caractères spéciaux
-n=Nombre de caractères
-c=Nombre
-p=Choix des caractères par l'utilisateur
-h=Afficher les options disponibles
Le script :

#!/bin/bash

OPT_PASS=$1
NBR_PASS=10
MAJ_PASS='A-Z'
MIN_PASS='a-z'
CHI_PASS='0-9'
SPE_PASS=',-|'
DEF_PASS="$MAJ_PASS$MIN_PASS$CHI_PASS$SPE_PASS"

MAN_PASS()
{
printf "Utilisation : [script] [-nMmsp]\n-n=Nombre de caractères\n-M=Majuscule\n-m=Minuscule\n-s=Caractères spéciaux\n-c=Nombre\n-p=Caractères définis par l'utilisateur\n-h=Afficher les options disponibles\n"
}

[ "$OPT_PASS" = '-n' ] && RAND_PASS="$DEF_PASS"

while getopts ":nMmscp" OPT_PASS
  do
	case "$OPT_PASS" in
	n )
	printf "Nombre de caractères du mot de passe\n"
	read NBR_PASS;;
    	M )
    	RAND_PASS=$RAND_PASS$MAJ_PASS;;
    	m )
    	RAND_PASS=$RAND_PASS$MIN_PASS;;
    	s )
    	RAND_PASS=$RAND_PASS$SPE_PASS;;
    	c )
    	RAND_PASS=$RAND_PASS$CHI_PASS;;
    	p )
    	printf "Définissez les caractères\n"
	read RAND_PASS;;
    	h )
    	MAN_PASS && exit 0;;
    	* )
    	MAN_PASS && exit 1;;
	esac
done

[ $# = 0 ] && RAND_PASS="$DEF_PASS"

grep -a -o "[$RAND_PASS]" /dev/urandom | tr -d "\n" | head -c "$NBR_PASS"
echo
exit 0

Exemple:

moguaye52@nunux:~$ /home/moguaye52/Bureau/script.sh
e9c3*YcpR$
moguaye52@nunux:~$ /home/moguaye52/Bureau/script.sh -sn
Nombre de caractères du mot de passe
40
'=/#'|}=\`)={`>*\>)*+*}<{}|'>}"<+&?<+>:>

Dernière modification par Yannou90 (Le 21/02/2010, à 15:13)

Hors ligne

#12 Le 21/02/2010, à 18:05

AnsuzPeorth

Re : [JEU] challenge bash #4

Bjr,
J'avais justement fait un petit script y'a un baille pour générer des mots de passe. Je l'ai volontairement compliqué un peu  (niveau lecture du script, et il n'y a plus les caractères écrit en 'dur').
J'utilse la commande random et modulo pour obtenir un résultat pseudo-aléatoire (à l'époque, de nombreux essais m'avais permis de trouver cette solution pour avoir de bon résultats, même sur une petite séquence de caractères 'source').

abs.traduc:

Un vrai « hasard », si tant est qu'il puisse exister, peut seulement être trouvé dans certains phénomènes naturels compris partiellement tels que la destruction radioactive. Les ordinateurs simulent le hasard et les séquences générées par ordinateur de nombres « aléatoires » sont du coup appelés pseudo-aléatoires

#!/bin/bash
ch="60 71"
min="141 172"
maj="101 132"
spe="41 57 72 100 133 140 173 175"

function Usage() 
{
echo "Usage : ./scritp.sh [-mMcsA] [nb caractères] [nb pass]
Script sans arguments, options: -A 6 5
Options :
   -m    minuscule
   -M    MAJUSCULE
   -c    chiffre
   -s    caractères spéciaux 
   -A    all
   -h    Aide"
exit
}

function GenPass ()
{
while [ "${#tab[@]}" -gt 0 ]
    do
	for ((i=${tab[0]};i<=${tab[1]};i++)); do
		[[ "$i" =~ [89] ]] && continue
		tab1=( ${tab1[@]} \\$i ); done  
	tab[0]=; tab[1]=; tab=( ${tab[@]} )
    done 
     
for ((i=1;i<=${nbc:=6};i++))
    do   
        pass="${pass}${tab1[$((RANDOM%${#tab1[@]}))]}"
    done  
printf "$pass\n"
unset pass
}

if [ -z "$*" ]; then
	var="$min $maj $ch $spe"
else
	while getopts ":mMcsA" Option
	  do
	    case $Option in
	        m)
	         var="${var} $min";;
	        M)
	         var="${var} $maj";;
	        c)
	         var="${var} $ch";;
	        s)
	         var="${var} $spe";;
	        A)
	         var="$min $maj $ch $spe";;
	        *|h)
	         Usage;;
	    esac
	  done
	shift $(($OPTIND - 1))
	nbc=$1
	nbp=$2
fi

tab=( $var )

for ((d=1;d<=${nbp:=5};d++))
    do
	GenPass
    done
exit
~$ /challenge4.sh 
F7g3t"
#$Sl2|
@Pn3mg
/6C/!A
dWMS|e

~$ /challenge4.sh -mMs 10 2
bUT`[ksDKi
V>Qm\!ZPD.

EDIT; Je me suis limité aux caractères spéciaux habituels, j'aurais pu en ajouter d'autres (en faisant légèrement différent), mais problème d'encodage lors de la copie vers fichier, pourtant, le résultat était ok en console.

Dernière modification par AnsuzPeorth (Le 21/02/2010, à 18:32)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#13 Le 21/02/2010, à 18:24

nicolas66

Re : [JEU] challenge bash #4

@nesthib > Peux-tu expliquer ce qui justifie tes modifs' ?


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne

#14 Le 21/02/2010, à 19:13

Ph3nix_

Re : [JEU] challenge bash #4

Plop les gens, voici ma contribution:

#!/bin/bash
CARAC=( '+ = $ % ! - # ~ " * [ ] ? @ , . ;' "$(echo {A..Z} {a..z})" "$(echo {0..9})" )
NB=( 2 5 3 10 )

gen() {
	n=$((RANDOM%3))
	[ ${NB[$n]} -gt 0 ] && {
		NB[$n]=$((NB[n]-1))
		PWD_="$PWD_""${CARAC[$n]:$((RANDOM%$((${#CARAC[$n]}/2))*2)):1}"
		((NB[3]--)); }
	[ ${NB[3]} -gt 0 ] && gen
}
gen
echo "$PWD_"

J'ai pas fait de gestion des options, mais il serait facile d'en rajouter une:

NB=( 2 5 3 10 )

- Le premier chiffre correspond au nombre de caractères spéciaux dans le mot de passe (ici 2)
- Le second au nombre de caractères alphabetiques (abcd.....zABC...Z) (ici 5)
- Le troisième au nombre de chiffre (ici 3)
- Le dernier a la taille du mot de passe (la somme des 3 précédents)

Les mot de passe généré sont 100% aléatoires (exemple d'exécution):

D*A@2Yk6R8
!8q5-4qUlq
?rh+iuc815
%%36W2whge
13[E2Kq+nw
54.6@hQoXi
IIXW.@F106
e=*3D3h7tv
[7FQ*11RmX
$gv%8hhp55
3x51-"vvLL
7.8~3lnInM
[3$17jKkVd
=w~034LsWQ
*O?16b4IUr
2F=d48vAi+
6=j11N%EtT
V8av~~0vL0
qe2[?61CTI
+u5O=X0e3y


Hiroshima 45 / Chernobyl 86 / Windows '95

Hors ligne

#15 Le 21/02/2010, à 19:51

toto2006

Re : [JEU] challenge bash #4

bon ma solution est un peu laborieuse sad

#!/bin/bash

NB_ALPHA_CHARS=8 
NB_NUMERIC_CHARS=0 
NB_SPECIAL_CHARS=0 
NB_CAPS_CHARS=0  
SPECIAL_CHARS="\$%!-#~\"*'[]?@,.;"
ALPHA_CHARS_CONS="bcdfghjklmnpqrstvwxz"
ALPHA_CHARS_VOY="aeiouy"
NUMERIC_CHARS="0123456789"
CAPS_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
NB_MDP=1

usage(){

cat << EOF

  usage: ${0} [OPTION...]

  GENERE (NB_MDP FOIS) UN MOT DE PASSE ALEATOIREMENT.
  
  Contenant:
   
  NB_ALPHA_CHARS  caracteres alphabetiques 
  NB_SPECIAL_CHARS  caracteres speciaux  
  NB_NUMERIC_CHARS caracteres numeriques 
  
  NB_CAPS_CHARS designe le nombre de caracteres majuscules
  parmis les NB_ALPHA_CHARS caracteres alphabetiques. 
  
  OPTIONS:

  -h  THIS HELP
  -a  NB_ALPHA_CHARS (default 8)
  -m  NB_SPECIAL_CHARS (default 0)
  -c  NB_NUMERIC_CHARS (default 0)
  -j  NB_CAPS_CHARS (default 0)
  -n  NB_MDP (default 1)
  
EOF

}

GenereMdp(){

	for ((i=0; i < NB_ALPHA_CHARS; i++)){	
		 [ "$i" -lt "$NB_CAPS_CHARS" ] && mdp="$mdp${CAPS_CHARS:$(($RANDOM % 26)):1}"  || {				
			[ $((i%2)) == 0 ]  && mdp="$mdp${ALPHA_CHARS_CONS:$(($RANDOM % 20)):1}" ||  mdp="$mdp${ALPHA_CHARS_VOY:$(($RANDOM % 6)):1}"
		}
	}
	for ((i=0; i <NB_NUMERIC_CHARS ; i++)){
		mdp="$mdp${NUMERIC_CHARS:$(($RANDOM % 10)):1}"
	}
	for ((i=0; i <NB_SPECIAL_CHARS ; i++)){
		mdp="$mdp${SPECIAL_CHARS:$(($RANDOM % 16)):1}"
	}

}

MelangeMdp(){	
	
	chaine=$1
	TC=${#chaine}
	mdp=""	
	
	for((i=0;i<TC;i++)){			
		Tchaine=${#chaine}	
		RND=$(($RANDOM % $Tchaine))						
		mdp="$mdp${chaine:$((RND)):1}"
		
		tmp=""		
		for((j=0;j<Tchaine;j++)){
			[ $((RND)) != $((j)) ] && tmp=$tmp${chaine:$((j)):1}			
		}
		chaine=$tmp		
	}
}

TestVar(){

	var=$1
	
	[ $var -eq 0 ] 2> /dev/null
	[ $? -ne 0 -a $? -ne 1 ] && {
		echo "Erreur $1 n'est pas un entier"
		exit 1
	}

}


while getopts "ha:m:c:j:n:" Option
do
	case $Option in
	 h )
	    usage && exit 0;;
        a)
            NB_ALPHA_CHARS=$OPTARG  && TestVar  $NB_ALPHA_CHARS;;
        m)
            NB_SPECIAL_CHARS=$OPTARG && TestVar  $NB_SPECIAL_CHARS;;
        c)
            NB_NUMERIC_CHARS=$OPTARG && TestVar  $NB_NUMERIC_CHARS;;
	j)
            NB_CAPS_CHARS=$OPTARG && TestVar  $NB_CAPS_CHARS;;	
	n)
            NB_MDP=$OPTARG && TestVar  $NB_MDP;;	
	    
        esac
done


for((a=0;a<NB_MDP;a++)){
	
	mdp=""
	GenereMdp
	MelangeMdp $mdp
	echo $mdp
}

exit 0
 ./mdp.sh -a 5 -m1 -c 2 -j2 -n 5
w2~6iFRs
Kg8Gen0@
4z]WzS7o
F'n20Wfi
0IlE-h8a

Hors ligne

#16 Le 21/02/2010, à 20:19

sputnick

Re : [JEU] challenge bash #4

nicolas66 a écrit :

@nesthib > Peux-tu expliquer ce qui justifie tes modifs' ?

nesthib t'explique que ta syntaxe est un peu "tordue". C'est pas des modifs, c'est des pistes d'améliorations. T'es pas obligé wink

Pour manipuler les chiffres la syntaxe avec les parenthèses me semble plus adaptée.

Pourquoi écrire

[ $var -lt 6 ]

quand on peux écrire simplement

(( var < 6 ))

?

Et puis quitte à utiliser les

[ ]

autant utiliser la version full bash

[[ ]]

qui est plus évoluée :
[[ $var -lt 6 ]]

<greybot> [[ is a bash keyword similar to (but more powerful than) the [ command. See http://mywiki.wooledge.org/BashFAQ/031 and http://mywiki.wooledge.org/BashGuide/Practices/BashTests Unless you are scripting for POSIX sh we recommend [[.

Dernière modification par sputnick (Le 21/02/2010, à 20:20)


bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#17 Le 21/02/2010, à 21:09

nicolas66

Re : [JEU] challenge bash #4

nesthib t'explique que ta syntaxe est un peu "tordue".

Perso, je trouve ça plus court d'utiliser seq que d'écrire la boucle en entier. Je pense que les scripts vont surtout différer sur la méthode de génération aléatoire. J'ai un doute sur la qualité des nombres pseudo-aléatoires obtenus via la variable RANDOM. Le mieux serait sans doute d'utiliser la batterie de tests NIST.


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne

#18 Le 21/02/2010, à 21:11

nesthib

Re : [JEU] challenge bash #4

l'intérêt de [ $var -gt 0 ] est que le test retourne un code d'erreur si var <= 0 et si var n'est pas un entier (pas (( var > 0 )) , enfin que dans un sens, je ne sais pas pourquoi…) mais on peut tout à fait utiliser la syntaxe [[ ]]

pour seq ce n'est pas une question d'être plus court mais plus efficace `seq …` = 1 process pour seq, 1 pour `…`


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#19 Le 21/02/2010, à 21:56

Yannou90

Re : [JEU] challenge bash #4

PFFFFFF...:rolleyes:
On les voit les docteurs !! lol

Bon ben je reprends mon sac de billes et je me pose vite fait dans un couin(couin)
Euhhhh , ici

x<-- big_smile

Sans rire ,y'a du lourd là , çà calme bien!
Mais pourquoi etais-je tand rebelle dans mes années college !
POURQUOI sad
x<--(j'y retourne)

Hors ligne

#20 Le 22/02/2010, à 01:55

AnsuzPeorth

Re : [JEU] challenge bash #4

Re,
Bon, j'ai rajouté des caractères. (j'aurais pu en ajouter plus, mais bon, ca suffit là, pour le cracker ce pass ... !)

#!/bin/bash

ch="48 57"
min="97 122"
maj="65 90"
spe="33 47 58 64 91 96 123 126"
spe1="194_161 194_172 194_174 194_191 195_128 195_191 196_128 196_191 197_128 197_191"
function Usage() 
{
echo "Usage : ./scritp.sh [-mMcsAS] [nb caractères] [nb pass]
Script sans arguments, options: -A 6 5
Options :
   -m    minuscule
   -M    MAJUSCULE
   -c    chiffre
   -s    caractères spéciaux 
   -A    all [-mMcs]
   -S    autres caractères spéciaux   
   -h    Aide"
exit
}

function GenPass ()
{
n=0
while [ "${#tab[@]}" -gt 0 ]
    do
	if [[ ${tab[0]} =~ _ ]]; then
	    MIN=${tab[0]/*_/}
	    MAX=${tab[1]/*_/}
	    IND=${tab[0]/_*/}
	    flag=1
	else
	    MIN=${tab[0]}
	    MAX=${tab[1]}
	    flag=0
	fi
	for ((i=$MIN;i<=$MAX;i++)); do
	n=$((n+1))
		if [ $flag = 1 ]; then
		   tab1=( ${tab1[@]} $(printf "%x_%x" $IND $i) )
		else
		   tab1=( ${tab1[@]} $(printf "%x" $i) )		
		fi
	 done  
	tab[0]=; tab[1]=; tab=( ${tab[@]} )
 
printf "$n caractères utilisés\r"    
    done 

for ((i=1;i<=${nbc:=6};i++))
    do   
        pass="${pass}\x${tab1[$((RANDOM%${#tab1[@]}))]//_/\x}"
    done  
printf "\n$pass"
unset pass
}

if [ -z "$*" ]; then
	var="$min $maj $ch $spe"
else
	while getopts ":mMcsAS" Option
	  do
	    case $Option in
	        m)
	         var="${var} $min";;
	        M)
	         var="${var} $maj";;
	        c)
	         var="${var} $ch";;
	        s)
	         var="${var} $spe";;
	        S)
	         var="${var} $spe1";;
	        A)
	         var="$min $maj $ch $spe";;
	        *|h)
	         Usage;;
	    esac
	  done
	shift $(($OPTIND - 1))
	nbc=$1
	nbp=$2
fi

tab=( $var )

for ((d=1;d<=${nbp:=5};d++))
    do
	GenPass
    done
echo
exit
~$ './challenge4.sh' -A 10 5
94 caractères utilisés
UVQ$&,<y[X
76}W-J[?J|
\Dg=&C8?j)
27&t}-m=b:
cm[NL&2<*D

~$ './challenge4.sh' -AS 10 5
316 caractères utilisés
ÜË!ċÃų4dcM
ņŝÈ\ŇÔőªįň
'ĺšúäłŕï¨Ī
ÍEÞżĦŭ7ſxŖ
Ïĥ3ĤĜĽąz8ļ

EDIT: J'ai fait un essais sur 5000 pass générés (min,Maj,chiffres), pas de doublons, donc l'aléatoire est efficasse ! (il faudrait tester sur un plus gros echantillon, mais bon ....

Dernière modification par AnsuzPeorth (Le 22/02/2010, à 02:18)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#21 Le 22/02/2010, à 09:07

Yannou90

Re : [JEU] challenge bash #4

Bonjour a tous

J'ai ajouté l'option "multiple mdp" et corrigé le script:

Utilisation :

[script] [-n -N -Mmscp]

-N=Nombre de mots de passe
-n=Nombre de caractères
-M=Majuscule
-m=Minuscule
-s=Caractères spéciaux
-c=Nombre
-p=Caractères définis par l'utilisateur
-h=Afficher les options disponibles

Le script :

#!/bin/bash

OPT_PASS=$1
VAR_NBR=0
NBR_FOI=1
NBR_PASS=10
MAJ_PASS=
MIN_PASS=
CHI_PASS=
SPE_PASS=
DEF_PASS="A-Za-z,-|0-9"

MAN_PASS()
{
printf "Utilisation : [script] [-n -N -Mmcsp]\n-N=Nombre de mots de passe\n-n=Nombre de caractères\n-M=Majuscule\n-m=Minuscule\n-s=Caractères spéciaux\n-c=Nombre\n-p=Caractères définis par l'utilisateur\n-h=Afficher les options disponibles\n"
}

while getopts ":N:n:Mmscp" OPT_PASS
  do
    case "$OPT_PASS" in
	N )
	NBR_FOI=$OPTARG;;
	n )
	NBR_PASS=$OPTARG;;
        M )
        DEF_PASS=
        MAJ_PASS='A-Z';;
        m )
        DEF_PASS=
        MIN_PASS='a-z';;
        s )
        DEF_PASS=
        SPE_PASS=',-|';;
        c )
        DEF_PASS=
        CHI_PASS='0-9';;
        p )
        printf "Définissez les caractères\n"
	read DEF_PASS;;
        h )
        MAN_PASS && exit 0;;
        * )
        MAN_PASS && exit 1;;
    esac
done

while [ "$VAR_NBR" != "$NBR_FOI" ]
do
grep -a -o "[$DEF_PASS$MAJ_PASS$MIN_PASS$CHI_PASS$SPE_PASS]" /dev/urandom | tr -d "\n" | head -c "$NBR_PASS"
echo
let "VAR_NBR++"
done
exit 0

Exemple :

./script sh
o2[}xGa?yE
./script sh  -n 50
@=a,k9HBTV+Nq.fsS9(x:MyQ^(qXA&,9]}K/}cN;<[o9#=1At^
./script sh  -n 30 -s -N 10
!<`,:?#\?\$+&:=/,+[,=#(,?}};'?
!.!:&=,)..+'#:)+|{#%<][[^{`'!^
\#:|\+[;|!{!,&/#>=(@{|(>?<]`*#
):,*\/$:`(&::})|#`+'`@\.#+$&($
:.{/[@<<?!!{~[$÷({]^%|!##{{$)
~}@]#:`&{<.[,::[):^\>$("+/~%)+
=>{%,$#)`${/!*(?[!({]^{=?<,,{(
`|+'"^~#]``}`\<&[&.+"`(,;<+*{<
{[}~~?~?.}~{]%^`{!:|][,'!?."!|
%~=!`^{"+>%!+{[{?(<$;|@#=<~/(*

Dernière modification par Yannou90 (Le 22/02/2010, à 09:10)

Hors ligne

#22 Le 23/02/2010, à 23:08

nesthib

Re : [JEU] challenge bash #4


      --- FIN DU CHALLENGE ---

le gagnant est AnsuzPeorth

solutions au post #2

n'oubliez pas de faire vos faire vos propositions de challenges


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#23 Le 23/02/2010, à 23:45

Yannou90

Re : [JEU] challenge bash #4

Bonsoir

Bravo AnsuzPeorth cool !!

Sur l'action je n'ai pas perçu le pourquoi de la difficultée , mais a la lecture de ton code , j'ai vite compris que des heures de recherches m'attendaient pour la préhension du résultat que tu souhaitais : à savoir déterminer de l'aléatoire .

Comme d'habitude je suis bluffé des solutions proposées wink

La solution de sputnick est violement denuée de code en étant particulièrement efficace (équivalente a la soluce de  AnsuzPeorth si je ne dis pas de bétises) :

On convertit le nombre decimal en octal pour l'affichage

Faut être vicieux quand même , on sent l'expérience , y'a pas photos !!

La solution de totor est a son image : puissante , détailler voir explicite mais incompréhensible pour le commun des mortels lol
Je veux dire que pour une foie la "solution"(la mienne hein ! roll) m'a sautée aux yeux et d'ailleurs j'ai posé mon faut bout de code de façon instantanée et fonctionnel , trop même puisque sans maîtrise il me donnait tout de même le résultat attendu (ch'uis bête des fois) !
Puis les débats ce sont ouvert sur la qualitée d'une caractéristique aléatoire ou pseudo-aléatoire (comment générer du on-ne-sait-quoi avec du je-sais-quoi)
Toujours est-il que j'ai alors compris la complexitée dissimulée de l'énoncé !
Comme d'habitude ce challenge m'a permi de progresser grâce a la lecture des codes des différents contribueurs et des recherches entreprises , ainsi que de confirmer mes convictions : VIVE LE LIBRE , VIVE LES CONTIBUEURS , VIVE LE PARTAGE !!!

Bravo à vous tous !

Merci à tous !!

Dernière modification par Yannou90 (Le 24/02/2010, à 00:07)

Hors ligne

#24 Le 24/02/2010, à 00:36

AnsuzPeorth

Re : [JEU] challenge bash #4

+1 sur l'analyse de Yannou90 au sujet des scripts de totor et sputnick.
D'ailleurs, sputnick arrive au même résultat que moi en 2 lignes ..... ! (j'avais un peu compliqué le truc, c'est vrai, mais j'étais , à l'origine, loin de 2 lignes smile).

@sputnick
J'aime bien: (par contre, pourquoi le '!' ?)

$(eval echo ${!cas})

J'avais déjà cherché, en vain, comment remplacer par une variable  {0..10} (dans une boucle for par exemple).

cas="{33..126}"
for nb in $(eval echo ${cas}); do echo $nb; done

Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#25 Le 24/02/2010, à 00:52

nesthib

Re : [JEU] challenge bash #4

c'est une syntaxe de substitution de contenu en nom de variable

variable=texte
abc=variable
echo ${!abc}

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

Haut de page ↑