mach est un outil CLI en Rust qui va plus loin que file : il identifie le
type d'un fichier, liste les processus qui l'utilisent, indique sa dernière
utilisation et cherche les fichiers qui y font référence (configs, logs...).
git clone https://github.com/Mavvidl/mach.git
cd mach
cargo build --releaseLe binaire est produit dans target/release/mach (mach.exe sur Windows).
Depuis la racine du projet :
cd /chemin/vers/mach
./target/release/mach --helpsudo install -m 755 target/release/mach /usr/local/bin/mach
mach --helpcd C:\chemin\vers\mach
cargo build --release
.\target\release\mach.exe --helpPour l’utiliser depuis n’importe quel dossier, ajoute le dossier de sortie au PATH :
$env:Path += ";C:\chemin\vers\mach\target\release"
mach.exe --helpOu copie le binaire dans un dossier déjà connu :
Copy-Item "C:\chemin\vers\mach\target\release\mach.exe" "C:\Windows\System32\mach.exe"
mach --helpTélécharge le binaire correspondant à ton OS depuis la page
Releases (généré automatiquement
par la CI à chaque tag vX.Y.Z).
Compatible Linux et Windows (voir la section « Limitations » pour les différences de comportement entre les deux).
mach <fichier> [OPTIONS]| Flag | Rôle |
|---|---|
-f, --file |
Fichier cible (alternative à la forme positionnelle) |
-t, --type |
Extension + type MIME/description |
-p, --process |
Processus liés (user, pid, statut, date) |
-s, --scan <dir> |
Répertoire(s) à scanner pour trouver des références au fichier |
-u, --usage |
Dernière utilisation + indicateur "en cours d'utilisation" |
-c, --call |
Cherche les fichiers qui appellent/référencent la cible |
-j, --json |
Sortie JSON |
Sans aucun flag d'affichage, mach active -t -p -u -c par défaut.
mach id_ed25519 --type --process --usage --json{
"file": "id_ed25519",
"extension": "",
"type": "OpenSSH private key",
"processes": [
{
"pid": 1234,
"user": "root",
"status": "Sleeping",
"last_used": "2026-08-10 08:30",
"confirmed": true
}
],
"usage": "Actuellement utilisé par le processus root (pid 1234)",
"last_accessed": "2026-08-10 08:30:12",
"last_modified": "2026-01-02 10:00:00",
"currently_in_use": true
}-
Type de fichier (
file_info.rs) :inferdétecte les formats binaires par signature (magic bytes). Pour les fichiers texte sans signature fiable (clés PEM/OpenSSH, JSON, YAML, scripts...), une heuristique de contenu prend le relais. En dernier recours, on retombe sur l'extension déclarée. -
Processus liés (
process_info.rs) :- Linux : lecture de
/proc/[pid]/fd/*— équivalent maison delsof. C'est une preuve directe qu'un processus a le fichier ouvert (confirmed: true). - Windows : il n'existe pas d'API simple et stable pour lister les
handles de fichiers ouverts par processus sans passer par des appels
natifs non documentés (
NtQuerySystemInformation) ou des outils tiers (Sysinternalshandle.exe). Le programme retombe donc sur une heuristique : il regarde si le nom du fichier apparaît dans le nom du processus ou sa ligne de commande (confirmed: false). C'est un indice, pas une certitude — à garder en tête si tu automatises des décisions dessus.
- Linux : lecture de
-
Usage (
usage.rs) : dates d'accès/modification via les métadonnées du système de fichiers. La détection "en cours d'utilisation" s'appuie sur les processus confirmés (Linux) ou, à défaut, sur une tentative d'ouverture en écriture exclusive (Windows : si ça échoue, le fichier est probablement verrouillé par quelqu'un d'autre). -
Références/appels (
scan.rs) : parcourt récursivement les répertoires donnés (walkdir) et cherche le nom du fichier dans le contenu texte de chaque fichier rencontré (regex), avec une limite de taille par fichier (5 Mo) pour rester rapide. Les fichiers binaires ou non-UTF8 sont ignorés silencieusement.
- La détection Windows des processus/handles est heuristique, pas fiable
à 100 % (voir ci-dessus). Pour un résultat fiable sur Windows, il faudrait
intégrer les API natives (
winapi/windows-rs) et énumérer les handles système — hors périmètre de cette première version. - Le scan de références est un simple
greprécursif, pas une analyse sémantique : il peut avoir des faux positifs si le nom du fichier est courant (ex.configapparaissant ailleurs sans lien réel). - Sur Linux, lire
/proc/[pid]/fdpour des process d'autres utilisateurs nécessite en général d'être root ; sinon ces process sont silencieusement ignorés (pas de crash, juste absent des résultats).
clap— parsing CLI (derive API)infer— détection de type par signature binairesysinfo— liste des processus, users, etc.walkdir— parcours récursif de répertoiresregex— recherche de motifs dans les fichiersserde/serde_json— sortie JSONchrono— formatage des dates
Les contributions sont bienvenues ! Voir CONTRIBUTING.md pour la mise en place du projet et les vérifications à faire avant une PR.
Ce projet est sous licence MIT — voir LICENSE.
Voir CHANGELOG.md pour l'historique des versions.