119 lines
2.9 KiB
Markdown
119 lines
2.9 KiB
Markdown
# mtm-ssh-menu
|
|
|
|
A Bash SSH target picker built around `fzf` and YAML configuration.
|
|
|
|
## What it does
|
|
|
|
- Lists SSH targets from grouped YAML files
|
|
- Uses the `group` value from each YAML file as the displayed group name
|
|
- Allows the YAML file name to differ from the group name
|
|
- Supports global defaults for user, port, and jump hosts
|
|
- Supports per-host overrides
|
|
- Can also browse entries from `~/.ssh/known_hosts`
|
|
- Launches `ssh` directly from the selected entry
|
|
|
|
## Requirements
|
|
|
|
- `ssh`
|
|
- `fzf`
|
|
- `jq`
|
|
- `yq`
|
|
|
|
## Usage
|
|
|
|
```bash
|
|
./mtm-ssh-menu [--config-dir DIR] [-k [user]]
|
|
```
|
|
|
|
Options:
|
|
|
|
- `-h`, `--help`: show help
|
|
- `--config-dir DIR`: use a custom configuration directory
|
|
- `-k`, `--known-hosts [user]`: include hosts from `~/.ssh/known_hosts`
|
|
|
|
By default, the script reads configuration from:
|
|
|
|
- `~/.config/mtm-ssh-menu/global.yaml`
|
|
- `~/.config/mtm-ssh-menu/hosts/*.yaml`
|
|
|
|
## Configuration format
|
|
|
|
### `global.yaml`
|
|
|
|
```yaml
|
|
ssh:
|
|
default_user: root
|
|
default_port: 22
|
|
default_options: ""
|
|
jump_hosts:
|
|
office: "user@192.168.10.11"
|
|
office-alt: "user@192.168.10.11:2222"
|
|
|
|
```
|
|
|
|
### `hosts/01_prod.yaml`
|
|
|
|
```yaml
|
|
group: prod
|
|
servers:
|
|
- name: api-1
|
|
aliases:
|
|
- api
|
|
- backend
|
|
host: 192.168.10.11
|
|
user: dev
|
|
port: 2222
|
|
|
|
- name: web-1
|
|
aliases:
|
|
- frontend
|
|
- ui
|
|
host: 192.168.10.12
|
|
user: dev
|
|
port: 22
|
|
```
|
|
|
|
### `hosts/03_dev.yaml`
|
|
|
|
```yaml
|
|
group: dev
|
|
servers:
|
|
- name: web-1
|
|
aliases:
|
|
- frontend
|
|
- web
|
|
host: web-1.prod.internal
|
|
jump_host: office
|
|
```
|
|
|
|
The file name does not need to match the `group` value. The script reads the `group` from the YAML content and uses the file path internally to load the selected host.
|
|
|
|
The sample configuration now uses numbered file names such as `01_prod.yaml`, `02_staging.yaml`, and `03_dev.yaml`.
|
|
|
|
Each host entry can define:
|
|
|
|
- `name`
|
|
- `aliases`
|
|
- `host`
|
|
- `user`
|
|
- `port`
|
|
- `jump_host`
|
|
|
|
## Sample configuration
|
|
|
|
A complete sample configuration is available in `sample-config/`.
|
|
|
|
## Notes
|
|
|
|
- `jump_host` values are resolved by name from `global.yaml`.
|
|
- Jump hosts support `user@host` and `user@host:port`; if the port is omitted, `22` is used.
|
|
- If a host does not define a user or port, global defaults are used.
|
|
- `default_options` is present in the config but not consumed by the current script.
|
|
- The sample config includes `ssh_options` in one file, but the current script does not consume it yet.
|
|
- Sample host examples are stored as `sample-config/hosts/01_prod.yaml`, `02_staging.yaml`, and `03_dev.yaml`.
|
|
- The `group` key is required for each host config file; the file name is only an internal storage detail.
|
|
- When `-k` is used, entries from `known_hosts` are shown with the selected user or `root` by default.
|
|
- `known_hosts` entries use port `22`.
|
|
- The script uses strict Bash mode (`set -euo pipefail`).
|
|
- The script name shown in usage is `sshm`, while the repository file is `mtm-ssh-menu`.
|