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

./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

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

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

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.
S
Description
A Bash SSH target picker built around fzf and YAML configuration.
Readme 78 KiB
Languages
TypeScript 82.1%
Shell 17.9%