MinitelOS
MHC-OS est un système d'exploitation personnalisé développé par la Minitel Hacking Crew pour ESP32, spécialement conçu pour être utilisé avec un Minitel. Ce projet transforme votre ESP32 en un terminal interactif rétro avec de nombreuses fonctionnalités modernes.
Install / Use
/learn @Minitel-Hacking-Crew/MinitelOSREADME
MinitelOS
Système d'exploitation Unix-like pour ESP32 + terminal Minitel 1B/2, développé par la Minitel Hacking Crew.
Description
MinitelOS transforme un ESP32 couplé à un Minitel en un vrai terminal interactif : shell complet, système de fichiers, gestion d'utilisateurs, réseau WiFi, SSH, scripting, cron, et simulateur natif pour développer sans matériel.
Démarrage rapide
Matériel requis
- ESP32 (devboard compatible Minitel)
- Minitel 1B ou 2
Prérequis logiciel
- PlatformIO (CLI ou extension VSCode)
Flash ESP32
pio run -t upload # compile + flash
pio device monitor # moniteur série (115200 bauds)
Simulateur natif (sans matériel)
Le script minitel-sim inclus dans le repo gère le build et le lancement en une seule commande :
./minitel-sim # build auto si absent, puis lance
./minitel-sim --baud=1200 # simule la vitesse Minitel 1B (1200 bauds)
./minitel-sim --baud=4800 # simule la vitesse Minitel 2
./minitel-sim --reset # remet à zéro les fichiers de session avant le lancement
./minitel-sim --build # force un rebuild complet
./minitel-sim --help # affiche l'aide
Prérequis : PlatformIO (
pip install platformio)
En mode manuel :
pio run -e native # compile uniquement
.pio/build/native/program # lance directement
Ce que simule le simulateur :
sim_fs/monté comme système de fichiers LittleFS- Terminal Minitel rendu en ANSI dans le terminal courant
- WiFi simulé avec internet réel via libcurl
--baudthrottle l'affichage des caractères visibles pour reproduire la vitesse série d'un vrai Minitel (les séquences de contrôle restent instantanées)
--reset supprime les fichiers générés à chaud par les sessions (/root/.groups, /etc/sudoers, /root/.fsmeta) pour repartir d'un état propre.
Premier démarrage
Au premier boot (ou après réinitialisation), un assistant de configuration se lance :
- Mot de passe root — définit le compte administrateur
- Création d'utilisateur — nom, mot de passe, niveau (user / admin)
- WiFi — scan et connexion optionnelle
- MOTD — message affiché à chaque connexion
Réinitialisation : appuyer 7× sur
CORRECTIONau démarrage (efface/etc/shadowet redémarre).
Shell — Référence des commandes
Système
| Commande | Description |
|----------|-------------|
| help | Aide complète |
| whoami | Utilisateur actuel |
| passwd | Changer son mot de passe |
| su <user> | Changer d'utilisateur |
| sudo <cmd> | Élévation temporaire root (sudoers ou mot de passe root) |
| adduser | Créer un utilisateur (root) |
| deluser | Supprimer un utilisateur (root) |
| groupadd <nom> | Créer un groupe (root) |
| groupdel <nom> | Supprimer un groupe (root) |
| groupmem <groupe> <user> | Ajouter un utilisateur à un groupe (root) |
| groupmem -d <groupe> <user> | Retirer un utilisateur d'un groupe (root) |
| groups [user] | Lister les groupes d'un utilisateur |
| sudoedit list | Afficher les règles sudoers (root) |
| sudoedit add <sujet> <cmds> | Ajouter une règle sudoers (root) |
| sudoedit del <num> | Supprimer une règle sudoers (root) |
| login / logout / exit | Connexion / déconnexion |
| reboot | Redémarrer l'ESP32 |
| clear | Effacer l'écran |
| version | Version du système |
| env | Variables d'environnement |
| export VAR=val | Définir une variable |
| date | Date et heure système |
| uptime | Temps de fonctionnement |
| free | Mémoire heap ESP32 |
| ps | Processus actifs + tâches cron |
| kill <index> | Supprimer une tâche cron |
| motd | Afficher le message du jour (+ exécute ~/motd_perso.txt si présent) |
| motd --help | Aide détaillée sur la commande motd |
| motd -s <msg> | Définir le message du jour système (root) |
Fichiers
| Commande | Description |
|----------|-------------|
| ls | Lister le répertoire courant |
| ls -l | Listing long : permissions, propriétaire, taille |
| cd <dir> | Changer de répertoire |
| pwd | Répertoire courant |
| cat <fichier> | Afficher un fichier |
| edit <fichier> | Éditeur de texte intégré |
| mkdir <dir> | Créer un dossier |
| rm <fichier> | Supprimer un fichier |
| cp <src> <dst> | Copier |
| mv <src> <dst> | Déplacer / renommer |
| touch <fichier> | Créer un fichier vide |
| grep <motif> | Recherche dans les fichiers |
| head / tail | Début / fin d'un fichier |
| chmod <mode> <fichier> | Changer les permissions (644, rwxr-xr-x…) |
| chown <user>[:<group>] <fichier> | Changer le propriétaire |
| df | Espace disque LittleFS (barre de progression) |
| du [path] | Taille d'un fichier ou répertoire |
Réseau
| Commande | Description |
|----------|-------------|
| ifconfig | IP, masque, gateway, DNS, MAC, RSSI |
| ping <host> | Test de connectivité ICMP |
| nslookup <host> | Résolution DNS |
| curl <url> | Requête HTTP/HTTPS |
| wifi <ssid> <pass> | Connexion WiFi |
| ssh <user@host> | Client SSH |
| sleep <sec> | Pause (float accepté, ex: sleep 0.5) |
Automatisation
| Commande | Description |
|----------|-------------|
| crontab | Éditer les tâches cron (/root/.crontab) |
| cronpause / cronresume | Suspendre / reprendre le cron |
Format crontab :
# intervalle_secondes commande
60 echo tick
300 curl http://exemple.fr/ping
Scripting — mShell (.msh)
Exécution : run monscript.msh
Variables
int compteur = 0
float temp = 20.5
string nom = "alice"
bool actif = true
x = 42 # auto-typage
Arithmétique (left op right correct)
int res = $a + $b # avec $
int res = a + b # ou sans $ (rétrocompat)
# opérateurs : + - * / %
Conditions
if score ge 90
echo excellent
else
if score ge 60
echo bien
endif
endif
# opérateurs int : eq ne gt lt ge le
# opérateurs string : seq sne
Boucles
for i 1 10 # for i $debut $fin aussi supporté
echo $i
endfor
while cnt lt 100
cnt = $cnt * 2
if cnt gt 50
break
endif
endwhile
Redirection
echo rapport > /root/rapport.txt
date >> /root/rapport.txt
cat /root/rapport.txt
Fonctions
Les fonctions peuvent être déclarées n'importe où dans le fichier (avant ou après leur appel).
func saluer
echo Bonjour $1 !
echo Vous avez $2 ans.
endfunc
func max
if $1 gt $2
echo $1
else
echo $2
endif
endfunc
call saluer Alice 30
call max 42 17
Paramètres : disponibles en $1, $2, … $argc (nombre d'arguments).
Les variables globales sont partagées avec les fonctions. $1…$9 et $argc sont sauvegardés/restaurés automatiquement entre appels.
Mots-clés spéciaux
break— sort d'une boucleexit— arrête le scriptreturn— sort de la fonction courante (ne stoppe pas le script parent)read VAR— lecture utilisateur (no-op en mode pipe)
Architecture
src/
├── main.cpp # Entrée ESP32
├── native_main.cpp # Entrée simulateur natif
├── globals.h / globals.cpp # État global partagé
├── applications/
│ ├── shell.h / shell.cpp # Dispatch commandes, historique
│ ├── firstboot.h / .cpp # Assistant premier démarrage
│ ├── shell_apps/
│ │ ├── shell_sys # Auth, users, session, help
│ │ ├── shell_fs # Fichiers (ls, cat, cp…)
│ │ ├── shell_edit # Éditeur vi-like
│ │ ├── shell_grep # Recherche
│ │ ├── shell_script # Interpréteur .msh
│ │ └── shell_extra # env, date, ps, sudo, df, du…
│ ├── cron/ # Planificateur de tâches
│ └── ssh/ # Client SSH (LibSSH-ESP32)
└── utils/ # I/O Minitel, WiFi, saisie
sim/
├── include/ # Stubs POSIX : Arduino, LittleFS, WiFi…
└── src/sim_impl.cpp # Implémentation simulateur
sim_fs/ # Système de fichiers simulé (monté à la racine)
├── etc/
│ └── shadow # Base d'authentification
├── root/
│ ├── demo.msh # Script de démonstration
│ ├── test_script.msh # Suite de tests
│ ├── .crontab # Tâches cron
│ └── .fsmeta # Permissions chmod/chown
└── home/
Modèle de privilèges
Niveaux d'accès
| Niveau | Description |
|--------|-------------|
| user | Utilisateur standard — accès à son home uniquement |
| admin | Accès étendu — peut gérer certains fichiers système |
| root | Accès total — toutes les commandes, tous les fichiers |
Changement de session
| Commande | Comportement |
|----------|-------------|
| su <user> | Switch permanent vers un autre utilisateur (demande son mot de passe, sauf si déjà root) |
| sudo <cmd> | Élévation temporaire root pour une commande — vérifie /etc/sudoers en premier (sans mot de passe si règle match), sinon demande le mot de passe root |
Permissions fichiers
Les permissions suivent le modèle Unix (rwxrwxrwx : propriétaire / groupe / autres).
chmod <mode> <fichier>— modifiable par le propriétaire ou root (644,rwxr-xr-x…)chown <user>[:<group>] <fichier>— changer le propriétaire (root) ou le groupe (propriétaire, si membre du groupe cible)- Les métadonnées sont stockées dans
/root/.fsmeta
Groupes
Les groupes contrôlent les bits groupe des permissions fichiers.
Groupes intégrés (non modifiables) :
| Groupe | Membres |
|--------|---------|
| user | Tous les utilisateurs connectés |
| admin | Utilisateurs de niveau admin et root |
| root | Uniquement root |
| <username> | Groupe per
