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:
+48
-18
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user