
Outil de découverte de réseau local avec une interface utilisateur terminal (TUI) interactive écrite en Go. Découvrez, explorez et comprenez votre réseau local de manière intuitive. Toc Toc.. qui est là ? 🚪
# Whosthere
[](https://go.dev/doc/devel/release)
[](LICENSE)
[](https://github.com/ramonvermeulen/whosthere/releases)
[](https://github.com/ramonvermeulen/whosthere/releases)
[](https://github.com/ramonvermeulen/whosthere)
Outil de découverte de réseau local (LAN) avec une interface utilisateur en terminal (TUI) interactive écrite en Go.
Découvrez, explorez et comprenez votre LAN de manière intuitive.
Whosthere effectue des **analyses simultanées et non privilégiées** à l'aide de scanners [**mDNS**](https://en.wikipedia.org/wiki/Multicast_DNS)
et [**SSDP**](https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol). De plus, il balaye le
sous-réseau local en tentant des connexions TCP/UDP pour déclencher la résolution ARP, puis lit le
[**cache ARP**](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) pour identifier les appareils de votre réseau local.
Cette technique remplit le cache ARP sans nécessiter de privilèges élevés. Tous les appareils découverts sont enrichis avec
des recherches [**OUI**](https://standards-oui.ieee.org/) pour afficher les fabricants lorsqu'ils sont disponibles.
Whosthere offre un moyen convivial et intuitif de répondre à la question que se pose tout administrateur réseau : « Qui est là sur mon réseau ? »

## Fonctionnalités
- **TUI interactive :** Naviguez et explorez les appareils découverts de manière intuitive.
- **Rapide et simultané :** Exploite plusieurs méthodes de découverte simultanément.
- **Aucun privilège élevé requis :** Fonctionne entièrement en espace utilisateur.
- **Enrichissement des appareils :** Utilise la recherche [**OUI**](https://standards-oui.ieee.org/) pour afficher les fabricants des appareils.
- **Scanner de ports intégré :** Découverte de services optionnelle sur les hôtes trouvés (ne scannez que les appareils pour lesquels vous avez l'autorisation !).
- **Mode démon avec API HTTP :** Exécutez en arrière-plan et intégrez avec d'autres outils.
- **Thèmes et configuration :** Personnalisez l'apparence et le comportement via un fichier de configuration YAML.
## Installation
Via [**Homebrew**](https://brew.sh/) avec `brew` :
```bash
brew install whosthere
```
Sur [**NixOS**](https://nixos.org/) avec `nix` :
```bash
nix profile install nixpkgs#whosthere
```
Sur [**Arch Linux**](https://archlinux.org/) avec `yay` :
```bash
yay -S whosthere-bin
```
Si votre gestionnaire de paquets n'est pas listé, vous pouvez toujours installer avec [**Go**](https://go.dev/) :
```bash
go install github.com/ramonvermeulen/whosthere@latest
```
Ou **compiler depuis les sources** :
```bash
git clone https://github.com/ramonvermeulen/whosthere.git
cd whosthere
make build
```
De plus, vous pouvez télécharger des binaires précompilés depuis la
[**page des versions**](https://github.com/ramonvermeulen/whosthere/releases).
## Utilisation
Lancez la TUI pour une découverte interactive :
```bash
whosthere
```
Lancez en CLI pour effectuer une seule analyse et afficher les résultats :
```bash
whosthere scan -t 5
```
Affichez les résultats dans un fichier JSON :
```bash
whosthere scan -t 5 --json --pretty > devices.json
```
Lancez en mode démon avec l'API HTTP :
```bash
whosthere daemon --port=8080
```
Importez des alias en masse depuis un fichier, ou exportez ceux actuels :
```text
whosthere aliases import ./aliases.yaml
whosthere aliases export --stdout
```
Des options de ligne de commande supplémentaires sont disponibles en exécutant :
```bash
whosthere --help
```
## Raccourcis clavier (TUI)
| Touche | Action |
| ------------------ | ------------------------------------- |
| `/` | Démarrer la recherche par regex |
| `k` | Haut |
| `j` | Bas |
| `g` | Aller en haut |
| `G` | Aller en bas |
| `y` | Copier l'IP de l'appareil sélectionné |
| `Y` | Copier la MAC de l'appareil sélectionné |
| `enter` | Afficher les détails de l'appareil |
| `CTRL+t` | Basculer le sélecteur de thème |
| `CTRL+i` | Basculer le sélecteur d'interface |
| `CTRL+c`/`q` | Arrêter l'application |
| `ESC` | Effacer la recherche / Retour |
| `p` (vue détails) | Démarrer le scan de ports sur l'appareil |
| `tab` (vue modale) | Changer la sélection de bouton |
## Configuration
Whosthere prend en charge plusieurs méthodes de configuration avec la priorité suivante (de la plus élevée à la plus faible) :
1. **Options de ligne de commande** - Priorité la plus élevée. Voir `whosthere --help` pour les options disponibles.
1. **Variables d'environnement** - Préfixe `WHOSTHERE__`. Voir [**Configuration via les variables d'environnement**](#configuration-via-les-variables-denvironnement).
1. **Fichier de configuration** - Fichier de configuration YAML. Voir [**Fichier de configuration**](#fichier-de-configuration).
1. **Valeurs par défaut** - Valeurs de repli par défaut. Voir `DefaultConfig()` dans [**config.go**](https://github.com/ramonvermeulen/whosthere/blob/main/internal/core/config/config.go).
### Fichier de configuration
Whosthere recherche le fichier de configuration dans l'ordre suivant, en utilisant le premier trouvé :
1. Chemin spécifié via l'option `--config` ou la variable d'environnement `WHOSTHERE_CONFIG`
1. `$XDG_CONFIG_HOME/whosthere/config.yaml` (si `XDG_CONFIG_HOME` est défini)
1. `~/.config/whosthere/config.yaml` (emplacement par défaut)
**Exemple de configuration :**
```yaml
# Uncomment the next line to configure a specific network interface - uses OS default if not set
# network_interface: eth0
# When enabled, devices from all network interfaces are shown and persist when switching interfaces
# Note: if two interfaces share the same subnet (e.g. both use 192.168.1.x), devices may get merged
# since they are identified by IP address. Use with caution on overlapping subnets.
all_interfaces: false
# Optional IPv4 CIDR subnets to sweep. When set, the sweeper skips the auto-detected interface subnet unless it is listed here.
# target_subnets: ["10.0.0.0/24", "10.0.1.0/24"]
# WARNING: scanning subnets larger than /16 sends packets to 65535+ IPs per subnet. Enable only if you understand the traffic implications. Consider using smaller /24 subnets for targeted scanning.
# scan_large_subnets: false
# How often to run discovery scans
scan_interval: 20s
# Maximum timeout for each scan, recommended to be less than the scan interval
scan_timeout: 10s
scanners:
mdns:
enabled: true
ssdp:
enabled: true
arp:
enabled: true
sweeper:
enabled: true
interval: 5m
timeout: 20s
port_scanner:
timeout: 5s
# List of TCP ports to scan on discovered devices
tcp: [21, 22, 23, 25, 80, 110, 135, 139, 143, 389, 443, 445, 993, 995, 1433, 1521, 3306, 3389, 5432, 5900, 8080, 8443, 9000, 9090, 9200, 9300, 10000, 27017]
splash:
enabled: true
delay: 1s
theme:
# When disabled, the TUI will use the terminal it's default ANSI colors
# Also see the NO_COLOR environment variable to completely disable ANSI colors
enabled: true
# See the complete list of available themes at https://github.com/ramonvermeulen/whosthere/tree/main/internal/ui/theme/theme.go
# Set name to "custom" to use the custom colors below
# For any color that is not configured it will take the default theme value as fallback
name: default
# Disable ANSI colors completely, overrides theme.enabled
# Can also be set via NO_COLOR or WHOSTHERE__THEME__NO_COLOR environment variables
# no_color: false
# Custom theme colors (uncomment and set name: custom to use)
# primitive_background_color: "#000a1a"
# contrast_background_color: "#001a33"
# more_contrast_background_color: "#003366"
# border_color: "#0088ff"
# title_color: "#00ffff"
# graphics_color: "#00ffaa"
# primary_text_color: "#cceeff"
# secondary_text_color: "#6699ff"
# tertiary_text_color: "#ffaa00"
# inverse_text_color: "#000a1a"
# contrast_secondary_text_color: "#88ddff"
aliases:
# Uncomment to import aliases.yaml into the local database on startup (only when it changed)
# auto_import: false
# Override the aliases file path - defaults to the app config directory
# file: "/path/to/aliases.yaml"
```
## Variables d'environnement
### Variables d'environnement générales
| Variable | Description |
| ------------------ | ------------------------------------------------------------------------------- |
| `WHOSTHERE_CONFIG` | Chemin vers le fichier de configuration, pour pouvoir remplacer l'emplacement par défaut. |
| `WHOSTHERE_LOG` | Définit le niveau de journalisation (par ex., `debug`, `info`, `warn`, `error`). Par défaut `info`. |
| `NO_COLOR` | Désactive les couleurs ANSI dans la TUI. |
### Configuration via les variables d'environnement
Toute option de configuration disponible dans la configuration YAML peut être définie via des variables d'environnement en utilisant le
préfixe `WHOSTHERE__` (notez le double underscore). Les clés de configuration imbriquées sont séparées par des doubles underscores, et
les clés sont insensibles à la casse.
Exemples :
- `WHOSTHERE__SPLASH__ENABLED=false` - Désactive l'écran de démarrage, équivalent à `splash.enabled: false` dans la configuration YAML
- `WHOSTHERE__SPLASH__DELAY=2s` - Définit le délai de l'écran de démarrage à 2 secondes, équivalent à `splash.delay: 2s` dans la configuration YAML
- `WHOSTHERE__SCAN_INTERVAL=30s` - Définit l'intervalle d'analyse à 30 secondes, équivalent à `scan_interval: 30s` dans la configuration YAML
- `WHOSTHERE__TARGET_SUBNETS=10.0.0.0/24,10.0.1.0/24` - Définit les sous-réseaux cibles, équivalent à `target_subnets: ["10.0.0.0/24", "10.0.1.0/24"]` dans la configuration YAML
- `WHOSTHERE__SCANNERS__MDNS__ENABLED=false` - Désactive le scanner mDNS, équivalent à `scanners.mdns.enabled: false` dans la configuration YAML
- `WHOSTHERE__PORT_SCANNER__TCP=80,443,8080` - Définit les ports TCP personnalisés à scanner, équivalent à `port_scanner.tcp: [80, 443, 8080]` dans la configuration YAML
- `WHOSTHERE__THEME__NAME=cyberpunk` - Définit le thème sur cyberpunk, équivalent à `theme.name: cyberpunk` dans la configuration YAML
## Alias d'appareils
Les alias résident dans une base de données locale [bbolt](https://github.com/etcd-io/bbolt) dans le répertoire d'état. Pour
en définir plusieurs à la fois, importez-les depuis un fichier YAML (`aliases.yaml` dans le répertoire de configuration ; remplacez avec
la clé de configuration `aliases.file` ou un argument de chemin).
Le fichier est un **patch, pas un miroir**, et n'est jamais lu qu'en lecture : l'importation insère ou met à jour les MAC qu'il contient
et laisse les autres intactes, et les modifications dans la TUI ne sont **jamais réécrites dans le fichier**. Utilisez `export` pour
le régénérer.
```yaml
version: 1
aliases:
aa:bb:cc:dd:ee:ff: "Living Room TV"
de:ad:be:ef:00:01: "Office Printer"
```
- `version` est la version du format de fichier ; utilisez `1` (les fichiers sans cette clé sont considérés comme version 1).
- Les MAC sont acceptées dans n'importe quel format courant et normalisées, donc `AA:BB:CC:DD:EE:FF`, `aa-bb-cc-dd-ee-ff`
et `aabbccddeeff` sont équivalents. Un alias vide (`""`) en efface un.
- Les MAC invalides sont ignorées et signalées ; le reste de l'importation est tout de même effectué.
```bash
whosthere aliases import # from the default location
whosthere aliases import ./aliases.yaml
whosthere aliases export # to the default location
whosthere aliases export --stdout # to stdout
```
Activez l'importation au démarrage avec `aliases.auto_import: true`. Le fichier est vérifié par hachage et n'est
réimporté que s'il a changé, donc un fichier non modifié n'écrase jamais vos modifications dans la TUI — mais un **fichier
modifié écrase** les alias pour chaque MAC qu'il contient. Gardez les alias propres à la TUI en dehors du fichier,
ou `export` après édition pour le garder synchronisé.
## API HTTP du mode démon
Lorsque Whosthere est exécuté en mode démon, il expose une API HTTP très simpliste avec les points de terminaison suivants :
| Méthode | Point de terminaison | Description |
| ------ | -------------- | ---------------------------------- |
| GET | `/devices` | Obtenir la liste de tous les appareils découverts |
| GET | `/device/{ip}` | Obtenir les détails d'un appareil spécifique |
| GET | `/health` | Vérification de l'état |
## Thèmes
Le thème peut être configuré via le fichier de configuration, ou à l'exécution via le raccourci clavier `CTRL+t`.
Une liste complète des thèmes disponibles se trouve [**ici**](https://github.com/ramonvermeulen/whosthere/blob/main/internal/ui/theme/theme.go), n'hésitez pas à ouvrir une PR pour ajouter votre propre thème !
Exemple de configuration de thème :
```yaml
theme:
enabled: true
name: cyberpunk
```
Lorsque le `name` est défini sur `custom`, les autres options de couleur peuvent être utilisées pour créer votre propre thème personnalisé.
Lorsque l'option `enabled` est définie sur `false`, la TUI utilisera les couleurs ANSI par défaut du terminal.
Lorsque la variable d'environnement `NO_COLOR` est définie, toutes les couleurs ANSI seront désactivées.
## Journalisation
Les journaux sont écrits dans le répertoire d'état de l'application :
- `$XDG_STATE_HOME/whosthere/app.log` (si `XDG_STATE_HOME` est défini)
- `~/.local/state/whosthere/app.log` (repli Linux/MacOS)
- `%LOCALAPPDATA%/whosthere/app.log` (repli Windows)
Lorsqu'il n'est pas exécuté en mode TUI, les journaux sont également écrits dans la console.
## Plateformes
Whosthere est pris en charge sur les plateformes suivantes :
- [x] Linux
- [x] macOS
- [x] Windows
## Problèmes connus
Pour que la fonctionnalité de presse-papiers fonctionne, un [**fork de go-clipboard**](https://github.com/dece2183/go-clipboard) est utilisé.
Assurez-vous d'avoir l'outil de copie approprié installé pour votre système d'exploitation :
| OS | Outils de copie pris en charge |
| -------------------------------------- | -------------------------------------------- |
| Darwin | `pbcopy` |
| Windows | `clip.exe` |
| Linux/FreeBSD/NetBSD/OpenBSD/Dragonfly | X11: `xsel`, `xclip` <br> Wayland: `wl-copy` |
## Avertissement
Whosthere est destiné à être utilisé sur des réseaux où vous avez l'autorisation d'effectuer la découverte et l'analyse du réseau,
comme votre propre réseau domestique. L'analyse non autorisée de réseaux peut être illégale et contraire à l'éthique.
Obtenez toujours une autorisation appropriée avant d'utiliser cet outil sur un réseau.
Cet outil a été créé principalement à des fins éducatives et pour l'exploration de réseaux domestiques. Bien que fonctionnel
et utile, il ne doit pas être considéré comme une solution professionnelle de surveillance réseau. Les résultats sont
basés sur des techniques d'analyse non privilégiées et peuvent ne pas être exhaustifs. Pour une analyse réseau critique
ou des évaluations de sécurité, envisagez d'utiliser des outils professionnels établis avec un support formel.
## Contribution
Les contributions et suggestions telles que les demandes de fonctionnalités, les rapports de bogues ou les améliorations sont les bienvenues !
N'hésitez pas à ouvrir des issues ou à soumettre des pull requests sur le dépôt GitHub.
Veuillez vous assurer de discuter de tout changement majeur dans une issue GitHub avant de les implémenter.