Compare commits

..

No commits in common. "a79f5cf687c9d36682c43397228df3c04f5039b7" and "4f61b3147a99591cb257887a74d9c8b38a22f843" have entirely different histories.

9 changed files with 57 additions and 307 deletions

View File

@ -19,10 +19,7 @@ ENV TZ=Europe/Paris
# SSH server # SSH server
RUN mkdir /run/sshd RUN mkdir /run/sshd
CMD ["netcat", "-lp", "5000", "-e", "/root/http/http_bash.sh"] CMD ["/usr/sbin/sshd", "-E", "/dev/stderr", "-D"]
# Nginx conf
COPY ./default /etc/nginx/sites-enabled/default
# Entrypoint # Entrypoint
COPY ./entrypoint.sh ./entrypoint.sh COPY ./entrypoint.sh ./entrypoint.sh

22
default
View File

@ -1,22 +0,0 @@
server {
listen 80 default_server;
listen [::]:80 default_server;
root /root/exercices/html;
index index.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
autoindex on;
}
location ~ /.sh$ {
proxy_pass http://127.0.0.1:5000;
}
}

View File

@ -73,13 +73,6 @@ echo "-------------------------------------------------------------"
echo " Setting root password" echo " Setting root password"
echo "root\nroot" | passwd 2>/dev/null >/dev/null echo "root\nroot" | passwd 2>/dev/null >/dev/null
echo "-------------------------------------------------------------"
echo " Starting Nginx"
nginx -c '/etc/nginx/nginx.conf'
echo "-------------------------------------------------------------"
echo " Starting SSH server"
/usr/sbin/sshd -E /dev/stderr
echo "-------------------------------------------------------------" echo "-------------------------------------------------------------"
echo " Running main process" echo " Running main process"

34
exercices/gen_arbo.sh Executable file → Normal file
View File

@ -1,26 +1,12 @@
#!/bin/bash #!/bin/bash
if [ "$#" -eq 0 ] ; then if [ "$#" -ne 1 ] ; then
echo 'Generate file tree at <path>. Not using random seed.'
mkdir -p /home/$USER echo 'Usage: $0 <path>'
cd /home/$USER
elif [ "$#" -eq 2 ] ; then
mkdir -p $1
cd $1
else
echo 'Generate file tree at /home/$USER. No random seed is used.'
echo 'This is the first script you should run, in this life or the next.'
echo "Usage: $0 --> Generate file tree at /home/\$USER with \$USER as owner of the files"
echo "Usage: $0 <path> <username> --> Generate file tree at <path> with <username> as owner of the files"
exit 1 exit 1
fi fi
#If you wish to change, add or remove items in this list, please be cautious never to use whitespace caracters in file- or foler names, nor special caracters (é, à,...), nor any escapable caracter which might pose an issue when handling within bash or sh (/, \, ", ', (), #, , ;, :, $, ...) cd $1
mkdir -p viens/voir/par/ici/si/jy/suis mkdir -p viens/voir/par/ici/si/jy/suis
echo "faites demi-tour avec prudence" > viens/voir/par/ici/si/jy/suis/ah_bah_non echo "faites demi-tour avec prudence" > viens/voir/par/ici/si/jy/suis/ah_bah_non
@ -50,15 +36,5 @@ touch Musique/Merryl_coucou
touch Musique/kriill_macarena touch Musique/kriill_macarena
touch Musique/Mona_Haydar_-_Hijabi touch Musique/Mona_Haydar_-_Hijabi
touch Musique/Aya_Nakamura touch Musique/Aya_Nakamura
touch Musique/Mili_World.execute.me touch Musique/Mili_World.execute(me)
if [ "$#" -eq 0 ] ; then
chown -R $USER /home/$USER
elif [ "$#" -eq 2 ] ; then
chown -R $2 $1
fi

130
exercices/gen_enonces.sh Executable file → Normal file
View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
if [ "$#" -lt 3 ] ; then if [ "$#" -lt 3 ] ; then
echo "Usage: $0 <seed> <eleve> [root] <dir> [pw]" echo 'Usage: $0 <seed> <eleve> [root] <dir> [pw]'
echo '<seed>: seed directory' echo '<seed>: seed directory'
echo '<eleve>: student name' echo '<eleve>: student name'
echo "<dir>: student's home directory" echo "<dir>: student's home directory"
@ -12,7 +12,6 @@ fi
seed=$1 seed=$1
eleve=$2 eleve=$2
dump=$3 #Hint : you should always pass /dev/null as $3, as it is considered safe for now.
root=$4 root=$4
pw="/root/config/passwords.txt" pw="/root/config/passwords.txt"
@ -20,29 +19,16 @@ if [[ "$#" == 5 ]] ; then
pw=$5 pw=$5
fi fi
enonces=enonces/$eleve mkdir -p enonces/$eleve prof/$eleve
corriges=corriges/$eleve
resultat=resultats/$eleve
html=./html
mkdir -p $enonces $corriges $html $resultat
rmdir $resultat ; touch $resultat
function ex1() { function ex1() {
#cd quelque part et touch un fichier #cd quelque part et touch un fichier
folder=$(head -n 1 $seed/$eleve/folders.seed) folder=$(head -n 1 $seed/$eleve/folders.seed)
echo -e "# EXERCICE 1 \n \nRends-toi dans le dossier \`$folder\` et crée un fichier dont le nom est ton prénom (avec une majuscule au début, et des tirets à la place des espaces). \n\t_Ex:_ \`$folder/Jean-claude\`" > $enonces/ex1.txt echo -e "\tEXERCICE 1\n\nRends-toi dans le dossier $folder et crée un fichier dont le nom est ton prénom (avec une majuscule au début, et des tirets à la place des espaces).\n\tEx: $folder/Jean-claude" > enonces/$eleve/ex1.txt
echo -e "\ echo -e "#!/bin/bash \nls $folder | grep -i $eleve ; exit \$?" > prof/$eleve/ex1.sh
#!/bin/bash \n\
ls $folder | grep -i $eleve >> $dump ; \n\
result=\$? \n\
if [[ \$result -eq 0 && ! \$(grep ex1 $resultat) ]] ; then \n\
\techo ex1 >> $resultat ; \n\
fi \n\
exit \$result" > $corriges/ex1.sh
} }
function ex2() { function ex2() {
@ -51,10 +37,7 @@ function ex2() {
folder=$(head -n 2 $seed/$eleve/folders.seed | tail -n 1) folder=$(head -n 2 $seed/$eleve/folders.seed | tail -n 1)
int=$(head -n 1 $seed/$eleve/ints.seed) int=$(head -n 1 $seed/$eleve/ints.seed)
#Si l'élève lit la doc de ls et essaie de faire un ls -a, il pourra lire les scripts de correction echo -e "\tEXERCICE 2\n\nRends-toi dans le dossier $folder.\nListe les fichiers présents.\nCrée le fichier qui continue la suite logique.\n\tEx: 1.txt 2.txt 3.txt" > enonces/$eleve/ex2.txt
ln -s $corriges $folder/.correction >> $dump
echo -e "# EXERCICE 2 \n\nRends-toi dans le dossier \`$folder\`. \nListe les fichiers présents. \nCrée le fichier qui continue la suite logique. \n\t_Ex:_ \`a.txt b.txt c.txt\` **--> \`d.txt\`**" > $enonces/ex2.txt
for i in $(seq 1 $int) ; do for i in $(seq 1 $int) ; do
touch $folder/$i.txt touch $folder/$i.txt
@ -62,14 +45,7 @@ function ex2() {
((i=int+1)) ((i=int+1))
echo -e "\ echo -e "#!/bin/bash \nls $folder | grep -i $i.txt ; exit \$?" > prof/$eleve/ex2.sh
#!/bin/bash \n\
ls $folder | grep -i $i.txt >> $dump \n\
result=\$? \n\
if [[ \$result -eq 0 && ! \$(grep ex2 $resultat) ]] ; then \n\
\techo ex2 >> $resultat ; \n\
fi \n\
exit \$result" > $corriges/ex2.sh
} }
function ex3() { function ex3() {
@ -82,16 +58,9 @@ function ex3() {
echo -e "Va créer un fichier $filename.txt dans le dossier $folder." > $folder2/$filename2 echo -e "Va créer un fichier $filename.txt dans le dossier $folder." > $folder2/$filename2
echo -e "# EXERCICE 3 \n \nSuis les instructions du fichier \`$folder2/$filename2\`" > $enonces/ex3.txt echo -e "Suis les instructions du fichier $folder2/$filename2" > enonces/$eleve/ex3.txt
echo -e "\ echo -e "#!/bin/bash \nls $folder | grep -i $filename ; exit \$?" > prof/$eleve/ex3.sh
#!/bin/bash \n\
ls $folder | grep -i $filename >> $dump \n\
result=\$? \n\
if [[ \$result -eq 0 && ! \$(grep ex3 $resultat) ]] ; then \n\
\techo ex3 >> $resultat ; \n\
fi \n\
exit \$result" > $corriges/ex3.sh
} }
function ex4() { function ex4() {
@ -99,18 +68,13 @@ function ex4() {
folder=$(head -n 1 $seed/$eleve/folders.seed) folder=$(head -n 1 $seed/$eleve/folders.seed)
echo -e "# EXERCICE 4 \n \nInscris le mot de passe avec lequel tu t'es connecté.e au début de la séance dans le fichier de l'**exercice 1**. \n \n_Rappel :_ ton fichier est censé se trouver dans le dossier \`$folder\`" > $enonces/ex4.txt echo -e "Inscris le mot de passe avec lequel tu t'es connecté.e au début de la séance dans le fichier de l'exercice 1.\n\nRappel : ton fichier est censé se trouver dans le dossier $folder" > enonces/$eleve/ex4.txt
echo -e "\ echo "#!/bin/bash" > prof/$eleve/ex4.sh
#!/bin/bash \n\ echo "file=\$(ls $folder | grep -m 1 -o -i $eleve)" >> prof/$eleve/ex4.sh
file=\$(ls $folder | grep -m 1 -o -i $eleve) \n\ echo "pass=\$(cat $pw | grep -i $eleve | cut -d = -f 2)" >> prof/$eleve/ex4.sh
pass=\$(cat $pw | grep -i $eleve | cut -d = -f 2) \n\ echo "cat $folder/\$file | grep -w \$pass" >> prof/$eleve/ex4.sh
cat $folder/\$file | grep -w \$pass >> $dump \n\ echo "exit \$?" >> prof/$eleve/ex4.sh
result=\$? \n\
if [[ \$result -eq 0 && ! \$(grep ex4 $resultat) ]] ; then \n\
\techo ex4 >> $resultat ; \n\
fi \n\
exit \$result" > $corriges/ex4.sh
} }
@ -120,32 +84,18 @@ function ex5() {
folder=$(head -n 1 $seed/$eleve/folders.seed) folder=$(head -n 1 $seed/$eleve/folders.seed)
filename=$(head -n 3 $seed/$eleve/filenames.seed | tail -n 1) filename=$(head -n 3 $seed/$eleve/filenames.seed | tail -n 1)
echo -e "# EXERCICE 5 \n \nNous allons maintenant manipuler le fichier de l'**exercice 4** et le déplacer dans l'arborescence de dossiers. \nMais avant toute chose, il s'agit d'une information sensible (ton mot de passe inscrit en clair, tout de même !), nous allons donc en faire une copie de sauvegarde. \nPour commencer, rends-toi dans le dossier de l'**exercice 4** et crée dans ce même dossier une copie du fichier \`$eleve\` qui s'appellera \`$eleve.$filename\`." > $enonces/ex5.txt echo -e "Nous allons maintenant manipuler le fichier de l'exercice 4 et le déplacer dans l'arborescence de dossiers. \nMais avant toute chose, il s'agit d'une information sensible (ton mot de passe inscrit en clair, tout de même !), nous allons donc en faire une copie de sauvegarde.\nCrée dans le même dossier une copie du fichier $eleve qui s'appellera $eleve.$filename." > enonces/$eleve/ex5.txt
echo -e "\ echo -e "#!/bin/bash\ntest -s $folder/$eleve -a \$(cat $folder/$eleve) = \$(cat $folder/$eleve.$filename)\nexit \$?" > prof/$eleve/ex5.sh
#!/bin/bash \n\
test -s $folder/$eleve -a \$(cat $folder/$eleve) = \$(cat $folder/$eleve.$filename) \n\
result=\$? \n\
if [[ \$result -eq 0 && ! \$(grep ex5 $resultat) ]] ; then \n\
\techo ex5 >> $resultat ; \n\
fi \n\
exit \$result" > $corriges/ex5.sh
} }
function ex6() { function ex6() {
#use mkdir #use mkdir
filename=$(head -n 4 $seed/$eleve/filenames.seed | tail -n 1) filename=$(head -n 4 $seed/$eleve/filenames.seed | tail -n 1)
echo -e "# EXERCICE 6 \n \nIl est temps de protéger un peu ces données personnelles et de s'inquiéter de la sécurité de tes données informatiques. \nCrée un dossier \`$filename\` dans \`$root/unix/home/sudo\`, puis le sous-dossier \`password-storage\` dans \`$root/unix/home/sudo/$filename\`. \nCe sera l'emplacement futur des données sensibles." > $enonces/ex6.txt echo -e "Il est temps de protéger un peu ces données personnelles e tde s'inquiéter de la sécurité de tes données informatiques.\nCrée un dossier $filename dans $root/unix/home/sudo, puis le sous-dossier password-storage dans $root/unix/home/sudo/$filename.\nCe sera l'emplacement futur des données sensibles." > enonces/$eleve/ex6.txt
echo -e "\ echo -e "#!/bin/bash\ntest -d \"$root/unix/home/sudo/$filename/password-storage\"\nexit \$?" > prof/$eleve/ex6.sh
#!/bin/bash \n\
test -d \"$root/unix/home/sudo/$filename/password-storage\" \n\
result=\$? \n\
if [[ \$result -eq 0 && ! \$(grep ex6 $resultat) ]] ; then \n\
\techo ex6 >> $resultat ; \n\
fi \n\
exit \$result" > $corriges/ex6.sh
} }
function ex7() { function ex7() {
@ -154,23 +104,18 @@ function ex7() {
folder=$(head -n 1 $seed/$eleve/folders.seed) folder=$(head -n 1 $seed/$eleve/folders.seed)
folder2=$root/Video/My_Little_Pony-Friendship_is_Magic folder2=$root/Video/My_Little_Pony-Friendship_is_Magic
filename=$(head -n 5 $seed/$eleve/filenames.seed | tail -n 1) filename=$(head -n 5 $seed/$eleve/filenames.seed | tail -n 1)
echo -e "# EXERCICE 7 \n \nMaintenant que cette piste alléchante a été déposée pour lurer d'éventuels intrus.es, on va ranger ton mot de passe là où personne n'ira jamais le chercher : \nDéplace le fichier \`$folder/$eleve\` contenant ton mot de passe dans le dossier \`$folder2\` en le renomant \`$filename\`" > $enonces/ex7.txt echo -e "Maintenant que cette piste alléchante a été déposée pour lurer d'éventuels intrus.es, on va ranger ton mot de passe là où personne n'ira jamais le chercher :\nDéplace le fichier $folder/$eleve contenant ton mot de passe dans le dossier $folder2 en le renomant $filename" > enonces/$eleve/ex7.txt
echo -e "\ echo -e "#!/bin/bash\n\nexit \$?" > prof/$eleve/ex7.sh
#!/bin/bash \n\
pass=\$(cat $pw | grep -i $eleve | cut -d = -f 2) \n\
if [[ -e $folder/$eleve ]] ; then \n\
exit 1 \n\
else \n\
cat $folder2/$filename | grep -w \$pass \n\
fi \n\
result=\$? \n\
if [[ \$result -eq 0 && ! \$(grep ex7 $resultat >> $dump) ]] ; then \n\
\techo ex7 >> $resultat ; \n\
fi \n\
exit \$result" > $corriges/ex7.sh
echo "#!/bin/bash" > prof/$eleve/ex7.sh
echo "pass=\$(cat $pw | grep -i $eleve | cut -d = -f 2)" >> prof/$eleve/ex7.sh
echo "if [[ -e $folder/$eleve ]] ; then " >> prof/$eleve/ex7.sh
echo " exit 1" >> prof/$eleve/ex7.sh
echo "else" >> prof/$eleve/ex7.sh
echo " cat $folder2/$filename | grep -w \$pass" >> prof/$eleve/ex7.sh
echo "fi" >> prof/$eleve/ex7.sh
echo "exit \$?" >> prof/$eleve/ex7.sh
} }
function ex8() { function ex8() {
@ -179,16 +124,9 @@ function ex8() {
folder=$(head -n 1 $seed/$eleve/folders.seed) folder=$(head -n 1 $seed/$eleve/folders.seed)
filename=$(head -n 3 $seed/$eleve/filenames.seed | tail -n 1) filename=$(head -n 3 $seed/$eleve/filenames.seed | tail -n 1)
echo -e "# EXERCICE 8 \n \nMaintenant que tes données sont bien sécurisées et à l'abri de tout.e hackeur.euse mal intentionné.e (_ahem..._), on peut se débarasser de la copie de sauvegarde que l'on avait faite à l'**exercice 5**. \nRetourne supprimer le fichier \`$folder/$eleve.$filename\` pour effacer tes traces." > $enonces/ex8.txt echo -e "Maintenant que tes données sont bien sécurisées et à l'abri de tout.e hackeur.euse mal intentionné.e (ahem...), on peut se débarasser de la copie de sauvegarde que l'on avait faite à l'exercice 5.\nRetourne supprimer le fichier $folder/$eleve.$filename pour effacer tes traces." > enonces/$eleve/ex8.txt
echo -e "\ echo -e "#!/bin/bash\ntest ! -e $folder/$eleve.$filename\nexit \$?" > prof/$eleve/ex8.sh
#!/bin/bash \n\
test ! -e $folder/$eleve.$filename \n\
result=\$? \n\
if [[ \$result -eq 0 && ! \$(grep ex8 $resultat) ]] ; then \n\
\techo ex8 >> $resultat ; \n\
fi \n\
exit \$result" > $corriges/ex8.sh
} }
@ -201,12 +139,4 @@ ex6
ex7 ex7
ex8 ex8
#chown root:root $corriges/ex*.sh
chmod +x $corriges/ex*.sh
for i in {1..8} ; do
echo -e " \n \n_Vérifie ton résultat :_ [Exercice $i](../$corriges/ex$i.sh)" >> $enonces/ex$i.txt
done
pandoc --from=markdown --to=html --output=$html/$eleve.html --table-of-contents --columns=80 $enonces/ex*.txt

17
exercices/gen_seed.sh Executable file → Normal file
View File

@ -1,17 +1,6 @@
#!/bin/bash #!/bin/bash
USAGE="$0 ROOT FOLDERS FILES FILENAMES INTEGERS USER DIR :\ USAGE="gen_seed.sh ROOT FOLDERS FILES FILENAMES INTEGERS USER DIR : generate a file USER.seed in the DIR folder, which can be then used to generate exercises."
\n\tgenerate a semi-random seed in the DIR folder, which can be then used to \n\
\trandomize exercises.\n\
Parameters:\n\
\tROOT : the folder in which to find folders, files, ... Usually, the student's\n\
\thome directory.\n\
\tFOLDERS : how many random folders to pick \n\
\tFILES : how many random files to pick\n\
\tFILENAMES : how many random filenames to pick from the dictionnary haddock.list\n\
\tINTEGERS : how many random integers to pick\n\
\tUSER : username of the student\n\
\tDIR : folder in which to store the generated seeds"
if [[ $# != 7 ]] ; then echo -e $USAGE ; exit 0 ; fi if [[ $# != 7 ]] ; then echo -e $USAGE ; exit 0 ; fi
@ -30,9 +19,9 @@ USER=$6
# Seeds storage # Seeds storage
DIR=$7 DIR=$7
if echo $DIR | grep -v /$ > /dev/null ; then DIR=$DIR/ ; fi if echo $DIR | grep -v /$ ; then DIR=$DIR/ ; fi
mkdir -p $DIR$USER ; mkdir $DIR$USER ;
find $root -type d | shuf | head -n $folders > $DIR$USER/folders.seed find $root -type d | shuf | head -n $folders > $DIR$USER/folders.seed

View File

@ -1,17 +0,0 @@
#!/bin/bash
if [ "$#" -ne 1 ] ; then
echo -e "usage : $0 <FILE>\n\tGenerate the exercice for a class.\nFILE must be a list containing identifiers (names) and passwords for each student, separated by a '='.\n\tEx:\n\t\tJean-claude-dus=mot_de_passe\n\t\tJean-dus-claude=passe_de_mot\n\t\tClaude-jean-dus=azerty\n\nThis file must be executed from the same folder as the files gen_arbo.sh, gen_seed.sh and gen_enonces.sh.\nFolders will be created in this directory, containing the exercices, their correction and the grades of the students."
exit 1;
fi
cat $1
home=/home
names=$(cut -d '=' -f 1 $1)
for name in $names ; do
./gen_arbo.sh $home/$name $name
./gen_seed.sh $home/$name 4 0 5 1 $name seeds
./gen_enonces.sh seeds $name /dev/null $home/$name $1
done

View File

@ -1,97 +0,0 @@
#!/usr/bin/env bash
#
# A simple, configurable HTTP server written in bash.
#
# See LICENSE for licensing information.
#
# Original author: Avleen Vig, 2012
# Reworked by: Josh Cartwright, 2012
warn() { echo "WARNING: $@" >&2; }
recv() { echo "< $@" >&2; }
send() { echo "> $@" >&2;
printf '%s\r\n' "$*"; }
[[ $UID = 0 ]] && warn "It is not recommended to run bashttpd as root."
DATE=$(date +"%a, %d %b %Y %H:%M:%S %Z")
declare -a RESPONSE_HEADERS=(
"Date: $DATE"
"Expires: $DATE"
"Server: Slash Bin Slash Bash"
)
add_response_header() {
RESPONSE_HEADERS+=("$1: $2")
}
declare -a HTTP_RESPONSE=(
[200]="OK"
[400]="Bad Request"
[403]="Forbidden"
[404]="Not Found"
[405]="Method Not Allowed"
[500]="Internal Server Error"
)
send_response() {
local code=$1
send "HTTP/1.0 $1 ${HTTP_RESPONSE[$1]}"
for i in "${RESPONSE_HEADERS[@]}"; do
send "$i"
done
send
while read -r line; do
send "$line"
done
}
send_response_ok_exit() { send_response 200; exit 0; }
fail_with() {
send_response "$1" <<< "$1 ${HTTP_RESPONSE[$1]}"
exit 1
}
serve_static_string() {
add_response_header "Content-Type" "text/plain;charset=utf-8"
send_response_ok_exit <<< "$1"
}
main () {
[ -x "$REQUEST_URI" ] || [ ! -d "$REQUEST_URI" ] || fail_with 404
serve_static_string "$(basename "$REQUEST_URI" | cut -d '.' -f 1) : $(sh "$REQUEST_URI" 2>&1 && echo Ok || echo 'Non validé')"
}
# Request-Line HTTP RFC 2616 $5.1
read -r line || fail_with 400
# strip trailing CR if it exists
line=${line%%$'\r'}
recv "$line"
read -r REQUEST_METHOD REQUEST_URI REQUEST_HTTP_VERSION <<<"$line"
[ -n "$REQUEST_METHOD" ] && \
[ -n "$REQUEST_URI" ] && \
[ -n "$REQUEST_HTTP_VERSION" ] \
|| fail_with 400
# Only GET is supported at this time
[ "$REQUEST_METHOD" = "GET" ] || fail_with 405
declare -a REQUEST_HEADERS
while read -r line; do
line=${line%%$'\r'}
recv "$line"
# If we've reached the end of the headers, break.
[ -z "$line" ] && break
REQUEST_HEADERS+=("$line")
done
main
fail_with 500

View File

@ -1,5 +1,5 @@
# Chasse au trésor en ssh # Chasse au trésor en ssh
Un environnement SSH avec des exercices ludiques. Un environnemnet SSH avec des exercices ludiques.
## Licence ## Licence
GPLv3 GPLv3
@ -10,29 +10,30 @@ ou
Créer un fichier `config/passwords.txt` qui contient la liste des couples nom=password (un nom/mot de passe par ligne). Créer un fichier `config/passwords.txt` qui contient la liste des couples nom=password (un nom/mot de passe par ligne).
Les comptes seront créés au démarrage du conteneur. Les comptes seront créés au démarage du conteneur.
## Présentation ## Présentation
Chaque élève a un dossier perso dans `/home` dans lequel il peut se connecter en SSH à laide de son mot de passe dans `config/passwords.txt`. Chaque élève a un dossier perso dans `/home` dans lequel il peut se connecter en SSH à laide de son mot de passe dans `config/passwords.txt`.
## Génération de lactivité ## Génération des données aléatoires pour les exercices
ATTENTION ! Cette génération ne doit pas se faire quand les élèves travaillent, leurs exercices seraient alors invalidés !
``` ```
cd exercices TODO
./init.sh
``` ```
## Énoncés des exercices ## Re-Génération des exercices
Les exercices sont disponibles pour les élèves via un navigateur. Pour créer les fichiers et les questions de chaque élèves on utilise la commande suivante.
Utile si lélève a sacagé son environnement de travail.
## Réparer les fichiers délève
Si un·e élève a saccagé ses fichiers, il est possible de les réparer en lançant la commande suivante.
$username est son nom dutilisateurice.
``` ```
cd exercices TODO
./init.sh $username
``` ```
## Ajouter des élèves en cours de route ## Correction
Pour suivre la progression des élèves, on utilise le script suivant.
```
TODO
```
## Ajouter des élèves
Si lactivité est déjà lancée et que vous souhaitez ajouter des élèves, faites le IMPÉRATIVEMENT __en bas du fichier__ `config/users.txt` ou `config/passwords.txt`. Si lactivité est déjà lancée et que vous souhaitez ajouter des élèves, faites le IMPÉRATIVEMENT __en bas du fichier__ `config/users.txt` ou `config/passwords.txt`.
Sans quoi les comptes peuvent être recréés avec des UID différents au redémarrage du conteneur et les droits seront incohérents. Sans quoi les comptes peuvent être recréés avec des UID différents au redémarrage du conteneur et les droits seront incohérents.
Vous pouvez ensuite générer à nouveau lactivité pour créer les dossiers des nouve·lles·aux élèves.