URL:     https://linuxfr.org/users/mathos6/journaux/utd-lancer-une-commande-sans-installer-son-paquet-debian-et-derives
Title:   utd : lancer une commande sans installer son paquet (Debian et dérivés)
Authors: Mathos6
Date:    2026-10-18T00:10:28+02:00
License: CC By-SA
Tags:    linux, debian, apt, golang, ligne_de_commande, ubuntu et logiciel_libre
Score:   -3


Bonjour à toutes et à tous,

Il m'arrive d'avoir besoin d'un outil une seule fois : un `figlet` pour une bannière, un `nmap` pour un scan ponctuel, une conversion avec `ffmpeg`. Je n'aime pas laisser sur ma machine des paquets dont je ne me resservirai pas, avec leurs dépendances. J'ai donc écrit **utd** (« Use Then Delete »), en Go, sous licence MIT.

Je précise que j’ai commencé par un prototype en bash et fait mes recherches avant de choisir Go. La réécriture a ensuite été faite en grande partie avec l’aide d’une IA, que j’ai guidée et dont j’ai testé le résultat. Elle a notamment ajouté `search` et `--dry-run`.

![Démo de utd](https://raw.githubusercontent.com/Mathos6/utd/main/assets/demo.gif)

## Principe

`utd` lance une commande qui n'est pas installée :

    utd figlet hello
    utd --delete=now nmap -p 22,80 192.168.1.1

1. Si la commande est déjà dans le `PATH`, il la lance simplement.
2. Sinon, il cherche le paquet qui la fournit.
3. Il demande à apt quelles dépendances manquent, puis télécharge les `.deb` avec `apt-get download`.
4. Il les extrait avec `dpkg-deb -x` dans `/tmp/utd`, sans toucher à `/usr`.
5. Il lance le programme depuis cet arbre privé. Si bubblewrap est présent, les paquets sont superposés au système en lecture seule, pour que les chemins codés en dur (`/usr/share/figlet`, par exemple) fonctionnent.

Pas d'`apt install`, pas de root. Tout disparaît au redémarrage, ou tout de suite avec `--delete=now`.

## La partie délicate : retrouver le paquet

Le nom de la commande n'est pas toujours celui du paquet : `dig` est dans `bind9-dnsutils`, `bat` installe `batcat`, `nc` passe par le système d'alternatives. `utd` essaie plusieurs sources dans l'ordre (table d'alias intégrée, paquet de même nom, index `Contents` d'apt, base de `command-not-found`, `apt-file`, `apt-cache search`). Il vérifie chaque candidat en cherchant le binaire dans le paquet avant de l'exécuter. `utd search <commande>` montre le résultat sans rien lancer.



## Limites

- Debian et dérivés uniquement pour l'instant (le code est écrit autour d'une interface `PackageManager`, donc d'autres gestionnaires sont envisageables).
- Les outils qui exigent root, des capacités ou des modules noyau (`tcpdump`, par exemple) ne marcheront pas depuis un arbre temporaire.
- Ce n'est **pas une sandbox de sécurité** : la commande tourne avec tes droits, voit tes fichiers et le réseau.



## Et `nix run` ou Distrobox ?

Ils font mieux sur la robustesse, la reproductibilité et l'isolation, et ils marchent hors de Debian. `utd` vise un cas plus étroit : sur une machine Debian, avoir une commande une fois, sans installer de gestionnaire ni de moteur de conteneurs, et avec un nettoyage automatique.

## Installation

Un binaire statique (amd64 et arm64) est disponible dans les [releases](https://github.com/Mathos6/utd/releases), avec les sommes SHA-256. Sinon : `make build` avec Go 1.24 ou plus.

Le dépôt : <https://github.com/Mathos6/utd>

C'est une version 0.1, et j'aimerais surtout des retours sur les cas où la résolution de commande échoue ou tombe sur le mauvais paquet, sur la gestion du dossier temporaire, et sur ce qui vous semblerait utile à ajouter. Merci d'avance !
