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
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
}