From 59f37d8455d507c1f09585c714cd4524d9381941 Mon Sep 17 00:00:00 2001 From: MatMoul Date: Sun, 31 May 2026 23:59:29 +0200 Subject: [PATCH] feat: add known_hosts entries to ssh menu Allow loading hosts from ~/.ssh/known_hosts via -k, with an optional user override. Also update the usage text and keep direct SSH connections working for generated known_hosts entries. --- mtm-ssh-menu | 66 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/mtm-ssh-menu b/mtm-ssh-menu index f4f646c..c82dee7 100755 --- a/mtm-ssh-menu +++ b/mtm-ssh-menu @@ -2,14 +2,17 @@ set -euo pipefail CONFIG_DIR="$HOME/.config/mtm-ssh-menu" +USE_KNOWN_HOSTS=0 +USE_KNOWN_HOSTS_USER="root" usage() { cat <<'EOF' -Usage: sshm [--config-dir DIR] +Usage: sshm [--config-dir DIR] [-k [user]] Options: - --help Show this help message - --config-dir DIR Use a custom config directory + -h | --help Show this help message + --config-dir DIR Use a custom config directory + -k | --known-hosts [user] Include known_hosts The config directory must contain: - global.yaml @@ -28,6 +31,16 @@ parse_args() { CONFIG_DIR="$2" shift 2 ;; + --known-hosts|-k) + USE_KNOWN_HOSTS=1 + if [ $# -eq 1 ]; then + USE_KNOWN_HOSTS_USER="root" + shift + else + USE_KNOWN_HOSTS_USER="$2" + shift 2 + fi + ;; --help|-h) usage exit 0 @@ -109,6 +122,17 @@ load_config() { done shopt -u nullglob } +load_known_hosts() { + local FILE_CONTENT GROUP_NAME + FILE_CONTENT=$(cat "$HOME"/.ssh/known_hosts | awk -F ' ' '{print $1}' | sort | awk '!seen[$1]++') + GROUP_NAME="Local" + for host in $FILE_CONTENT; do + if [ "$SERVERS" != "" ]; then + SERVERS+="\n" + fi + SERVERS+="${GROUP_NAME} | ${host} | ${host} | ${host} | ${USE_KNOWN_HOSTS_USER} | 22" + done +} popup_menu() { local SERVER SERVER=$(echo -e "${SERVERS}" | column -t -s "|" -o "|" | fzf -e --layout=reverse --with-nth=1,3,4,5,6 --delimiter="|") @@ -118,27 +142,33 @@ popup_menu() { ssh_connect "$GROUP_NAME" "$HOST_INDEX" } ssh_connect() { - local SERVER SSH_SERVER_USER SSH_SERVER_HOST SSH_SERVER_PORT SSH_SERVER_OPTIONS SSH_JUMP_HOST - SERVER=$(cat "$HOSTS_DIR/$1.yaml" | yq -r '.servers'"[$2]") - SSH_SERVER_USER=$(jq -r '.user // "'"$DEFAULT_SSH_USER"'"' <<<"$SERVER") - SSH_SERVER_HOST=$(jq -r '.host // ""' <<<"$SERVER") - SSH_SERVER_PORT=$(jq -r '.port // "'"$DEFAULT_SSH_PORT"'"' <<<"$SERVER") + if [[ "$HOST_INDEX" != *"."* ]]; then + local SERVER SSH_SERVER_USER SSH_SERVER_HOST SSH_SERVER_PORT SSH_SERVER_OPTIONS SSH_JUMP_HOST + SERVER=$(cat "$HOSTS_DIR/$1.yaml" | yq -r '.servers'"[$2]") + SSH_SERVER_USER=$(jq -r '.user // "'"$DEFAULT_SSH_USER"'"' <<<"$SERVER") + SSH_SERVER_HOST=$(jq -r '.host // ""' <<<"$SERVER") + SSH_SERVER_PORT=$(jq -r '.port // "'"$DEFAULT_SSH_PORT"'"' <<<"$SERVER") - SSH_SERVER_OPTIONS="-p $SSH_SERVER_PORT" - SSH_JUMP_HOST=$(jq -r '.jump_host // ""' <<<"$SERVER") - if [ "$SSH_JUMP_HOST" != "" ]; then - SSH_JUMP_HOST=$(jq -r '.'"$SSH_JUMP_HOST"' // ""' <<<"${SSH_JUMP_HOSTS}") - SSH_JUMP_HOST="-t $SSH_JUMP_HOST ssh -p $SSH_SERVER_PORT" - SSH_SERVER_OPTIONS="" + SSH_SERVER_OPTIONS="-p $SSH_SERVER_PORT" + SSH_JUMP_HOST=$(jq -r '.jump_host // ""' <<<"$SERVER") + if [ "$SSH_JUMP_HOST" != "" ]; then + SSH_JUMP_HOST=$(jq -r '.'"$SSH_JUMP_HOST"' // ""' <<<"${SSH_JUMP_HOSTS}") + SSH_JUMP_HOST="-t $SSH_JUMP_HOST ssh -p $SSH_SERVER_PORT" + SSH_SERVER_OPTIONS="" + fi + + # shellcheck disable=SC2086 + ssh ${SSH_SERVER_OPTIONS} ${SSH_JUMP_HOST} "${SSH_SERVER_USER}"@"${SSH_SERVER_HOST}" + else + ssh "${USE_KNOWN_HOSTS_USER}"@"${2}" fi - - #echo "ssh ${SSH_SERVER_OPTIONS} ${SSH_JUMP_HOST} ${SSH_SERVER_USER}@${SSH_SERVER_HOST}" - # shellcheck disable=SC2086 - ssh ${SSH_SERVER_OPTIONS} ${SSH_JUMP_HOST} "${SSH_SERVER_USER}"@"${SSH_SERVER_HOST}" } main() { load_config + if [ "$USE_KNOWN_HOSTS" == 1 ]; then + load_known_hosts + fi popup_menu }