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
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user