
Pour ce projet, j’utilise le shield 3615 Mega, un module horloge temps réel, un module carte SD et la bibliothèque Minitel1B_Hard.

Pour ce projet, j’utilise le shield 3615 Mega, un module horloge temps réel, un module carte SD et la bibliothèque Minitel1B_Hard.
ss -tulnp
La commande ss -tulnp est utilisée sous Linux pour afficher les connexions réseau actives et les ports ouverts sur sa machine. Voici ce que chaque option signifie :
-t : Affiche les connexions TCP.
-u : Affiche les connexions UDP.
-l : Affiche uniquement les ports en écoute (listening).
-n : Affiche les numéros de port au lieu de résoudre les noms de service (plus rapide).
-p : Affiche le processus (PID et nom) qui utilise le port.
À quoi ça sert ?
Vérifier quels ports sont ouverts sur sa machine.
Savoir quels services écoutent sur ces ports.
Identifier quel processus utilise un port (utile pour déboguer ou arrêter un service).
Diagnostiquer des problèmes réseau (ex : un service ne démarre pas à cause d’un port déjà utilisé).
Nom du fichier : ScanReseauLocal.sh
#!/bin/bash
# Si on n'est pas dans un terminal, se relancer dans mate-terminal
if ! [ -t 1 ]; then
mate-terminal -- bash -c "sudo bash '$0'; exec bash"
exit
fi
# =============================================================
# ScanReseauLocal.sh — Scanner réseau local (Debian)
# Dépendances : nmap → sudo apt install nmap
# Optionnelles : avahi-utils → sudo apt install avahi-utils (mDNS)
# =============================================================
# Utilisation :
# Scan automatique (détecte ton réseau tout seul)
# sudo ~/Bureau/ScanReseauLocal.sh
# Scan sur une plage personnalisée
# sudo ~/Bureau/ScanReseauLocal.sh 192.168.1.0/24
# Scan + ports ouverts d'un appareil précis
# sudo ~/Bureau/ScanReseauLocal.sh --ports 192.168.0.42
set -uo pipefail
# ── Couleurs ─────────────────────────────────────────────────
BOLD='\033[1m'
CYAN='\033[0;36m'
GREEN='\033[0;32m'
ORANGE='\033[38;5;214m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m'
# ── Vérifications préalables ─────────────────────────────────
check_deps() {
local missing=()
for cmd in nmap ip; do
command -v "$cmd" &>/dev/null || missing+=("$cmd")
done
if [[ ${#missing[@]} -gt 0 ]]; then
echo -e "${RED}Dépendances manquantes : ${missing[*]}${NC}"
echo -e "Installe-les avec : ${ORANGE}sudo apt install nmap iproute2${NC}"
exit 1
fi
# Avertissement si avahi-resolve manque
if ! command -v avahi-resolve &>/dev/null; then
echo -e "${YELLOW}⚠ avahi-resolve non installé : device name (mDNS) indisponible${NC}"
echo -e " ${ORANGE}sudo apt install avahi-utils${NC}"
echo
fi
}
# ── Détection automatique du réseau actif ────────────────────
detect_network() {
local cidr
cidr=$(ip -4 addr show scope global \
| grep -oP '(?<=inet\s)\d+\.\d+\.\d+\.\d+/\d+' \
| head -1)
if [[ -z "$cidr" ]]; then
echo -e "${RED}Impossible de détecter le réseau. Vérif ta connexion.${NC}"
exit 1
fi
echo "$cidr"
}
# ── Résolution du device name via mDNS ───────────────────────
resolve_device_name() {
local ip="$1"
local name=""
if command -v avahi-resolve &>/dev/null; then
local mdns
mdns=$(avahi-resolve -a "$ip" 2>/dev/null \
| awk '{print $2}' \
| sed 's/\.local\.$//')
[[ -n "$mdns" ]] && name="$mdns (mDNS)"
fi
echo "$name"
}
# ── Scan principal ───────────────────────────────────────────
scan_network() {
local cidr="$1"
echo
echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
echo -e "${BOLD}${CYAN} 🔍 SCAN RÉSEAU LOCAL ${NC}"
echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
echo -e " Plage cible : ${ORANGE}${cidr}${NC}"
echo -e " Démarré le : $(date '+%d/%m/%Y %H:%M:%S')"
echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
echo
local raw
raw=$(sudo nmap -sn -T4 \
-PE -PP \
-PS21,22,23,25,80,443,445,3389,8080 \
-PA80,443 \
-PR \
"$cidr" 2>/dev/null)
local count=0
while IFS= read -r line; do
if [[ "$line" =~ ^"Nmap scan report for " ]]; then
local host="${line#Nmap scan report for }"
local ip hostname
local regex='\(([^)]+)\)$'
if [[ "$host" =~ $regex ]]; then
hostname="${host%% (*}"
ip="${BASH_REMATCH[1]}"
else
ip="$host"
hostname=""
fi
local mac vendor mac_line
mac_line=$(echo "$raw" | grep -A3 "^Nmap scan report for ${host}$" \
| grep "MAC Address" || true)
if [[ -n "$mac_line" ]]; then
mac=$(echo "$mac_line" | awk '{print $3}')
vendor=$(echo "$mac_line" | sed 's/.*(\(.*\))/\1/')
else
mac="N/A (machine locale ou accès limité)"
vendor=""
fi
# Résolution du device name
local device_name
device_name=$(resolve_device_name "$ip")
count=$(( count + 1 ))
echo -e " ${BOLD}${GREEN}▸ Appareil #${count}${NC}"
echo -e " IP : ${ORANGE}${ip}${NC}"
[[ -n "$hostname" ]] && \
echo -e " Hostname : ${CYAN}${hostname}${NC}"
[[ -n "$device_name" ]] && \
echo -e " Device name : ${YELLOW}${device_name}${NC}"
echo -e " MAC : ${mac}"
[[ -n "$vendor" ]] && \
echo -e " Fabricant : ${vendor}"
echo
fi
done <<< "$raw"
echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
echo -e " ${BOLD}${GREEN}${count} appareil(s) détecté(s)${NC}"
echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
echo
}
# ── Optionnel : scan de ports sur un appareil ────────────────
scan_ports() {
local ip="$1"
echo
echo -e "${BOLD}${CYAN}── Scan des ports ouverts sur ${ip} ─────────${NC}"
sudo nmap -T4 --open --top-ports 100 "$ip" 2>/dev/null \
| grep -E "^[0-9]+/(tcp|udp)|Nmap scan" \
| sed "s/^/ /"
echo
}
# ── Point d'entrée ───────────────────────────────────────────
main() {
check_deps
local cidr="${1:-}"
local port_ip=""
while [[ $# -gt 0 ]]; do
case "$1" in
--ports)
port_ip="${2:-}"
shift 2
;;
*)
cidr="$1"
shift
;;
esac
done
[[ -z "$cidr" ]] && cidr=$(detect_network)
scan_network "$cidr"
if [[ -n "$port_ip" ]]; then
scan_ports "$port_ip"
fi
}
main "$@"
Nom du fichier : Mon_Répertoire.sh
(autoriser l’exécution du fichier comme un programme)
#!/bin/bash
COMMANDES="
cd '/media/$USER/Mon Répertoire'
exec bash
"
# Si on n'est pas dans un terminal, se relancer dans mate-terminal
if ! [ -t 1 ]; then
mate-terminal -- bash -c "$COMMANDES"
exit
fi
# Si on est déjà dans un terminal, exécution directe
eval "$COMMANDES"
Nom du fichier : MAJ.sh
(autoriser l’exécution du fichier comme un programme)
#!/bin/bash
# ON AFFICHE LE CONTENU DU SCRIPT PAR MESURE DE SÉCURITÉ
COMMANDES="
cat '$0'
echo
sudo apt-get update && sudo apt-get upgrade
sudo apt-get autoremove && sudo apt-get autoclean
exec bash
"
# Si on n'est pas dans un terminal, se relancer dans mate-terminal
if ! [ -t 1 ]; then
mate-terminal -- bash -c "$COMMANDES"
exit
fi
# Si on est déjà dans un terminal, exécution directe
eval "$COMMANDES"
\documentclass[border=10pt]{standalone}
\usepackage{circuitikz}
\ctikzset{resistor=european}
\begin{document}
\begin{circuitikz}[scale=1.2]
% === une grille pour s'aider ===
% \draw [help lines] (-2,-1) grid (9,5);
% === Source à gauche (bornes inversées) ===
\draw (0,3) to[battery1] (0,0);
% === Flèche tension U à gauche du générateur, pointant vers le haut ===
\draw[->, thick] (-0.6,0.4) -- (-0.6,2.6) node[midway, left] {$U$};
% === Fil bas de la source ===
\draw (0,0) -- (6,0);
% === Fil supérieur gauche avec courant I ===
\draw (0,3) to[short, i=$I$] (3,3);
% === Courant I1 sur le fil avant R1, puis R1 centré sur la branche ===
\draw (3,3) to[short, i=$I_1$] (3.6,3);
\draw (3.6,3) to[R, l_=$R_1$] (5.4,3);
\draw (5.4,3) -- (6,3);
\draw[->, thick] (5.4,3.55) -- (3.6,3.55) node[midway, above] {$U_1$};
% === Fils verticaux gauche et droit du bloc parallèle ===
\draw (3,3) -- (3,1.5);
\draw (6,3) -- (6,1.5);
% === Courant I2 sur le fil vertical gauche descendant vers R2 ===
\draw (3,3) to[short, i_=$I_2$] (3,1.5);
% === Branche basse : R2 + R3 en série ===
\draw (3,1.5) to[R, l=$R_2$] (4.5,1.5)
to[R, l=$R_3$] (6,1.5);
\draw[->, thick] (4.3,1.0) -- (3.2,1.0) node[midway, below] {$U_2$};
\draw[->, thick] (5.8,1.0) -- (4.7,1.0) node[midway, below] {$U_3$};
% === Fermeture droite du circuit ===
\draw (6,3) -- (8,3) -- (8,0) -- (6,0);
\end{circuitikz}
\end{document}
Texmaker génère un pdf, mais on peut aussi utiliser en ligne de commande :
pdflatex circuit.tex
Pour obtenir une image svg à intégrer dans LibreOffice :
sudo apt-get install pdf2svg pdf2svg circuit.pdf circuit.svg
Un fichier bash circuit.sh pour automatiser tout ça :
#!/bin/bash
# Vérification de l'argument
if [ $# -ne 1 ]; then
echo "Usage : $0 fichier.tex"
exit 1
fi
FICHIER="$1"
# Vérification que le fichier existe
if [ ! -f "$FICHIER" ]; then
echo "Erreur : fichier '$FICHIER' introuvable."
exit 1
fi
# Nom sans extension
NOM="${FICHIER%.tex}"
# Compilation LaTeX
echo "Compilation LaTeX..."
pdflatex -interaction=nonstopmode "$FICHIER"
if [ $? -ne 0 ]; then
echo "Erreur lors de la compilation LaTeX."
exit 1
fi
# Conversion en SVG
echo "Conversion en SVG..."
pdf2svg "${NOM}.pdf" "${NOM}.svg"
if [ $? -ne 0 ]; then
echo "Erreur lors de la conversion en SVG."
exit 1
fi
# Nettoyage des fichiers temporaires
rm -f "${NOM}.aux" "${NOM}.log"
echo "Terminé : ${NOM}.pdf et ${NOM}.svg générés."
Utilisation :
chmod +x circuit.sh ./circuit.sh circuit.tex
Programme html / js : Le code obtenu est à copier / coller dans font1dat.c (https://github.com/eserandour/Mode13h_OpenWatcom_FreeDOS).
FreeDOS 1.4 est sorti en avril 2025.
Quelques notes, pour mémoire.
Site officiel
Dépôts officiels FreeDOS
Site YouTube FreeDOS
Après avoir installé la version minimale de FreeDOS 1.4 dans VirtualBox, je monte l’image du BonusCD (téléchargée depuis le site officiel sous le nom FD14BNS.iso) dans le lecteur optique virtuel de la machine.
FDIMPLES est un outil visuel et interactif de FreeDOS qui permet de parcourir, installer et supprimer des paquets inclus sur les supports de distribution de FreeDOS (comme les CD Live, BonusCD, etc.). Il s’agit d’un gestionnaire de paquets qui lit les médias d’installation pour identifier les logiciels disponibles à l’installation ou à la suppression. Pour l’utiliser, il suffit de lancer la commande FDIMPLES depuis l’invite de commandes de FreeDOS.
Pour programmer, j’ai choisi le compilateur Open Watcom C/C++et l’ éditeur de texte FED car il permet de plier / déplier le code. J’ai également installé l’assembleur NASM et l’éditeur hexadécimal uHex.
Dans C:\>FDAUTO.BAT, je rajoute à la fin :
cd PERSO REM *** FED 2.24c *** alias fed=C:\APPS\FED\FED.EXE REM *** OPEN WATCOM C/C++ 1.9 *** => à mettre en dernier C:\DEVEL\WATCOMC\OWSETENV.BAT
Mémo FED :
Alt pour accéder au menu
CTRL-C pour fermer
CTRL-F pour plier / déplier le code
En pratique, pour être efficace, je n’utilise pas l’éditeur de texte sous FreeDOS :
1 – Je code avec mon éditeur sous Debian.
2 – Dans VirtualBox, Je vérifie que la machine virtuelle FreeDOS 1.4 est éteinte.
3 – J’exécute ce fichier bash (Vers_FreeDOS.sh), le paquet libguestfs-tools étant installé :
#!/bin/bash
# Interpréteur : on utilise bash explicitement
# Si on n'est pas dans un terminal, se relancer dans un terminal graphique
if ! [ -t 1 ]; then
mate-terminal -e "bash -c '$0; read -p \"Appuie sur Entrée pour fermer...\"'"
exit
fi
set -e
# Arrête le script immédiatement si une commande échoue (exit on error)
# Évite que les erreurs passent silencieusement et causent des dégâts en cascade
set -x
# Mode debug : affiche chaque commande avant de l'exécuter (précédée de "+")
# Utile pour suivre l'exécution pas à pas
mkdir ~/VHD
# Crée un répertoire temporaire "VHD" dans le dossier home (~)
# Ce dossier servira de point de montage pour l'image disque
cd "/media/$USER/Fichiers Eric/VirtualBox/FreeDOS 1.4"
# Se déplace dans le répertoire contenant l'image VHD
# $USER est automatiquement remplacé par le nom de l'utilisateur courant
guestmount -a "FreeDOS 1.4.vhd" -m /dev/sda1 ~/VHD
# Monte l'image disque VHD via libguestfs (paquet guestfs-tools)
# -a "FreeDOS 1.4.vhd" : spécifie le fichier image à utiliser
# -m /dev/sda1 : monte la première partition du disque virtuel
# ~/VHD : point de montage (le dossier créé plus haut)
# Permet d'accéder au contenu de la VM sans la démarrer
cp -R "/media/$USER/Fichiers Eric/VirtualBox/FreeDOS 1.4/PERSO" ~/VHD
# Copie récursivement le dossier PERSO dans l'image montée
# -R : copie les sous-dossiers et fichiers récursivement
# C'est l'opération principale : injecter des fichiers dans la VM
guestunmount ~/VHD
# Démonte proprement l'image VHD
# Équivalent d'un umount, mais adapté aux images guestfs
# Important : à faire avant de supprimer le point de montage
rm -r ~/VHD
# Supprime le répertoire de montage temporaire devenu inutile
# -r : suppression récursive (nécessaire pour un dossier)
# Nettoyage final — le dossier devrait être vide après guestunmount
# --- Message de succès ---
set +x # On désactive le mode debug pour un affichage propre
echo ""
echo "✅ Succès ! Le dossier PERSO a été copié dans l'image FreeDOS."
echo ""
4 – Dans VirtualBox, je démarre la machine virtuelle FreeDOS 1.4
5 – Sous FreeDOS, je compile mon fichier source avec : wcl source.c -q
Mon programme de test du mode 13h est ici :
https://github.com/eserandour/Mode13h_OpenWatcom_FreeDOS
https://allthingsopen.org/articles/how-to-write-your-first-freedos-program
https://www.both.org/?p=12007
https://opensource.com/article/21/9/programming-dos-conio
apt list --installed > liste_paquets_debian_13_par_apt.txt dpkg --list > liste_paquets_debian_13_par_dpkg.txt
Au préalable, aller dans le BIOS :
Avancé > Configuration Processeur > Technologie Intel Virtualization > Active
Site officiel : https://www.virtualbox.org
Télécharger VirtualBox (7.2.6) et VirtualBox Extension Pack (7.2.6) :
=> https://download.virtualbox.org/virtualbox/7.2.6/virtualbox-7.2_7.2.6-172322~Debian~trixie_amd64.deb
=> https://download.virtualbox.org/virtualbox/7.2.6/Oracle_VirtualBox_Extension_Pack-7.2.6.vbox-extpack
Dans la console :
cd Téléchargements wget https://download.virtualbox.org/virtualbox/7.2.6/SHA256SUMS sha256sum --ignore-missing -c SHA256SUMS sudo gdebi virtualbox-*.deb
Ouvrir VirtualBox et installer l’extension téléchargée précédemment :
Paramètres > Extensions > Ajoute une nouvelle extension
Dans la console :
Pour connaître les versions installées de headers / image : uname -a apt policy linux-headers-amd64 linux-image-amd64
Installation : sudo apt-get install linux-headers-amd64 sudo apt-get install linux-image-amd64
Redémarrer l’ordinateur.
Dans la console :
cd /sbin sudo ./vboxconfig
Erreur rencontrée et résolution :
VT-x is being used by another hypervisor (VERR_VMX_IN_VMX_ROOT_MODE). VirtualBox can’t operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot (VERR_VMX_IN_VMX_ROOT_MODE).
Vérifier si KVM est activé :
lsmod | grep kvm
Désactiver KVM temporairement :
sudo modprobe -r kvm_intel # Pour les processeurs Intel sudo modprobe -r kvm_amd # Pour les processeurs AMD
Désactiver KVM de manière permanente (optionnel) :
sudo nano /etc/modprobe.d/blacklist-kvm.conf Ajouter les lignes suivantes dans ce fichier pour bloquer KVM : blacklist kvm blacklist kvm_intel blacklist kvm_amd
Redémarrer l’ordinateur.
On peut maintenant installer des machines virtuelles…
Si besoin, installer les Additions invité sur la machine virtuelle (permet notamment le partage de dossiers entre l’hôte et l’invité).
Pour une désinstallation complète de VirtualBox :
sudo apt remove --purge virtualbox* -y
GeoGebra 6 n’est plus disponible à l’installation pour Debian. Le lien suivant concerne GeoGebra 5 (Version 5.4.920.0 du 10/03/2026).
=> https://download.geogebra.org/package/linux-port
Décompresser l’archive GeoGebra-Linux-Portable-5-4-920-0.tar.bz2.
Autoriser l’exécution du fichier geogebra-portable comme un programme.
geogebra.desktop (voir ci-dessous) est à mettre dans le répertoire /home/$USER/.local/share/applications. $USER est à remplacer par un identifiant, ci-dessous également.
[Desktop Entry] Type=Application Name=GeoGebra Comment=Créer des constructions mathématiques et des appliquettes Exec=/home/$USER/.local/share/geogebra/GeoGebra-Linux-Portable-5-4-920-0/geogebra-portable Icon=/home/$USER/.local/share/geogebra/geogebra.png Terminal=false Categories=Education;