Gitfed
bastien-mrq/sssh / README.md
README.md Code Preview
# sssh — simple-ssh

Un gestionnaire de connexions SSH minimaliste : un nom court par serveur, un TUI pour choisir, et c'est tout.

![Démo du TUI](vhs/demo.gif)

## Fonctionnalités

- `sssh <nom>` se connecte directement — un préfixe unique suffit (`sssh ino` → `inoval`)
- `sssh` sans argument ouvre un TUI avec filtre instantané
- Ajout en une ligne ou via formulaire dans le TUI
- Import de tes hosts existants depuis `~/.ssh/config` (multi-sélection interactive ou one-liner)
- Support port, clé privée, ProxyJump (qui peut référencer un autre host sssh) et tags
- Export / import pour synchroniser entre machines
- La connexion délègue au `ssh` système (`exec`) : agent, TTY, config… tout marche comme un ssh normal

## Installation

```sh
git clone ssh://git@git.neuromancer.ovh:2222/bastien-mrq/sssh.git
cd sssh
go build -o sssh .
mv sssh ~/.local/bin/   # ou n'importe où dans ton PATH
```

### Complétion shell

```sh
# fish
cp completions/sssh.fish ~/.config/fish/completions/

# bash — dans ~/.bashrc :
source /chemin/vers/sssh/completions/sssh.bash

# zsh — dans un répertoire du fpath, avant compinit :
mkdir -p ~/.zsh/completions && cp completions/_sssh ~/.zsh/completions/
# puis dans ~/.zshrc : fpath=(~/.zsh/completions $fpath)
```

La complétion propose les noms de hosts enregistrés et les sous-commandes.

## Usage

![Démo add et list](vhs/add.gif)

```sh
sssh                                   # TUI de sélection
sssh serveur-1                         # connexion directe
sssh serv                              # préfixe unique accepté
sssh vps-ovh uptime                    # exécute une commande distante

sssh add vps-ovh debian@203.0.113.21   # ajout en une ligne
sssh add api deploy@192.0.2.7:2222 -i ~/.ssh/id_deploy -J bastion -t client,prod
sssh edit vps-ovh                      # formulaire d'édition
sssh rm vps-ovh
sssh list

sssh export > hosts.toml               # sauvegarde / partage
sssh import hosts.toml                 # fusionne (--force pour écraser)

sssh import-ssh                        # importe depuis ~/.ssh/config (interactif)
sssh import-ssh bastion vps            # importe ces hosts-là directement
```

## Export, import et synchronisation

`sssh export` sort l'intégralité de tes hosts au format `hosts.toml` — le même format que le fichier de config, donc un export est directement réutilisable :

```sh
sssh export                    # affiche le TOML sur la sortie standard
sssh export sauvegarde.toml    # écrit dans un fichier
```

Seuls les hosts gérés par sssh sont exportés ; ceux de `~/.ssh/config` (lecture seule) n'en font pas partie.

`sssh import` **fusionne** un fichier exporté avec tes hosts existants :

- un nom qui n'existe pas encore est ajouté ;
- un nom déjà présent est ignoré (ta version locale est conservée) ;
- avec `--force`, les noms déjà présents sont écrasés par la version du fichier.

```sh
sssh import sauvegarde.toml            # ajoute les nouveaux, garde le reste
sssh import sauvegarde.toml --force    # le fichier fait foi
```

### Synchroniser deux machines

Le plus direct, de machine à machine (sssh sait déjà s'y connecter) :

```sh
sssh export | ssh autre-pc "sssh import /dev/stdin"
# ou en deux temps :
sssh export /tmp/hosts.toml && scp /tmp/hosts.toml autre-pc:
```

Pour une synchro permanente, pointe `$SSSH_CONFIG` vers un fichier partagé (dossier Syncthing, iCloud, Dropbox…) sur les deux machines, ou versionne `~/.config/sssh/` dans un repo git.

### Raccourcis du TUI

| Touche | Action |
|---|---|
| `↑↓` / `jk` | naviguer |
| `/` puis texte | filtrer |
| `entrée` | se connecter |
| `a` | ajouter un host |
| `e` | éditer |
| `d` | supprimer (avec confirmation) |
| `i` | importer depuis `~/.ssh/config` |
| `q` | quitter |

## Configuration

Les hosts vivent dans `~/.config/sssh/hosts.toml` (surchargeable avec `$SSSH_CONFIG`) :

```toml
[hosts.serveur-1]
user = "root"
host = "192.0.2.11"
port = 22                     # optionnel
identity = "~/.ssh/id_prod"   # optionnel
jump = "bastion"              # optionnel — nom sssh ou [user@]host[:port]
tags = ["client", "prod"]     # optionnel
```

C'est un simple fichier : pour synchroniser deux machines, copie-le, ou versionne `~/.config/sssh/` dans un repo git.

### Bastion / ProxyJump

Le champ `jump` (option `-J` de `sssh add`, champ « Jump host » du formulaire) accepte :

- le **nom d'un autre host sssh** : sa cible réelle (user, IP, port) est utilisée, et si ce host a lui-même un `jump`, la chaîne complète est construite (`ssh -J hop1,hop2 cible`) ;
- une **spécification ssh brute** `[user@]host[:port]`, passée telle quelle.

```sh
sssh add bastion admin@203.0.113.10
sssh add serveur-prive deploy@10.0.4.2 -J bastion
sssh serveur-prive    # → ssh -J admin@203.0.113.10 deploy@10.0.4.2
```

Limite d'OpenSSH : `-J` ne prend pas de clé par hop ; si un bastion demande une clé spécifique, déclare-la dans `~/.ssh/config` (`Host bastion` + `IdentityFile`).

### Importer depuis `~/.ssh/config`

`sssh import-ssh` liste les alias concrets de ton `~/.ssh/config` qui ne sont pas encore dans sssh et te laisse cocher ceux à importer (espace pour sélectionner, `ctrl+a` pour tout prendre). Les champs supportés sont copiés : `HostName`, `User`, `Port`, `IdentityFile`, `ProxyJump`. Avec des noms en arguments, l'import est direct, sans interaction. La touche `i` dans le TUI fait la même chose.

`~/.ssh/config` n'est jamais modifié : l'import copie les entrées dans `hosts.toml`, les originales restent en place.

## Développement

```sh
go build ./...
go vet ./...
```

Les GIFs de démo sont générés avec [VHS](https://github.com/charmbracelet/vhs) :

```sh
go build -o vhs/fakebin/sssh . && vhs vhs/demo.tape && vhs vhs/add.tape
```

Construit avec [Bubble Tea](https://github.com/charmbracelet/bubbletea), [huh](https://github.com/charmbracelet/huh) et [go-toml](https://github.com/pelletier/go-toml).

## Licence

[GNU GPL v3](LICENSE)