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.
This commit is contained in:
2026-05-31 23:59:29 +02:00
parent ccd38c5e31
commit 59f37d8455
+48 -18
View File
@@ -2,14 +2,17 @@
set -euo pipefail set -euo pipefail
CONFIG_DIR="$HOME/.config/mtm-ssh-menu" CONFIG_DIR="$HOME/.config/mtm-ssh-menu"
USE_KNOWN_HOSTS=0
USE_KNOWN_HOSTS_USER="root"
usage() { usage() {
cat <<'EOF' cat <<'EOF'
Usage: sshm [--config-dir DIR] Usage: sshm [--config-dir DIR] [-k [user]]
Options: Options:
--help Show this help message -h | --help Show this help message
--config-dir DIR Use a custom config directory --config-dir DIR Use a custom config directory
-k | --known-hosts [user] Include known_hosts
The config directory must contain: The config directory must contain:
- global.yaml - global.yaml
@@ -28,6 +31,16 @@ parse_args() {
CONFIG_DIR="$2" CONFIG_DIR="$2"
shift 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) --help|-h)
usage usage
exit 0 exit 0
@@ -109,6 +122,17 @@ load_config() {
done done
shopt -u nullglob 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() { popup_menu() {
local SERVER local SERVER
SERVER=$(echo -e "${SERVERS}" | column -t -s "|" -o "|" | fzf -e --layout=reverse --with-nth=1,3,4,5,6 --delimiter="|") 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 "$GROUP_NAME" "$HOST_INDEX"
} }
ssh_connect() { ssh_connect() {
local SERVER SSH_SERVER_USER SSH_SERVER_HOST SSH_SERVER_PORT SSH_SERVER_OPTIONS SSH_JUMP_HOST if [[ "$HOST_INDEX" != *"."* ]]; then
SERVER=$(cat "$HOSTS_DIR/$1.yaml" | yq -r '.servers'"[$2]") local SERVER SSH_SERVER_USER SSH_SERVER_HOST SSH_SERVER_PORT SSH_SERVER_OPTIONS SSH_JUMP_HOST
SSH_SERVER_USER=$(jq -r '.user // "'"$DEFAULT_SSH_USER"'"' <<<"$SERVER") SERVER=$(cat "$HOSTS_DIR/$1.yaml" | yq -r '.servers'"[$2]")
SSH_SERVER_HOST=$(jq -r '.host // ""' <<<"$SERVER") SSH_SERVER_USER=$(jq -r '.user // "'"$DEFAULT_SSH_USER"'"' <<<"$SERVER")
SSH_SERVER_PORT=$(jq -r '.port // "'"$DEFAULT_SSH_PORT"'"' <<<"$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_SERVER_OPTIONS="-p $SSH_SERVER_PORT"
SSH_JUMP_HOST=$(jq -r '.jump_host // ""' <<<"$SERVER") SSH_JUMP_HOST=$(jq -r '.jump_host // ""' <<<"$SERVER")
if [ "$SSH_JUMP_HOST" != "" ]; then if [ "$SSH_JUMP_HOST" != "" ]; then
SSH_JUMP_HOST=$(jq -r '.'"$SSH_JUMP_HOST"' // ""' <<<"${SSH_JUMP_HOSTS}") SSH_JUMP_HOST=$(jq -r '.'"$SSH_JUMP_HOST"' // ""' <<<"${SSH_JUMP_HOSTS}")
SSH_JUMP_HOST="-t $SSH_JUMP_HOST ssh -p $SSH_SERVER_PORT" SSH_JUMP_HOST="-t $SSH_JUMP_HOST ssh -p $SSH_SERVER_PORT"
SSH_SERVER_OPTIONS="" 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 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() { main() {
load_config load_config
if [ "$USE_KNOWN_HOSTS" == 1 ]; then
load_known_hosts
fi
popup_menu popup_menu
} }