fzf

jj6

#!/bin/bash
export LANG=C
# 全局禁用fzf鼠标支持(兼容旧版本fzf)
export FZF_DEFAULT_OPTS="--no-mouse"

# 主目录设置为/root
ROOT_DIR="/root"

# 查找/root目录下所有包含jump_hosts文件的子目录
find_jump_directories() {
    find "$ROOT_DIR" -type f -name "jump_hosts" -print0 2>/dev/null | while IFS= read -r -d '' file; do
        dirname "$file"
    done | sort -u
}

# 选择包含jump_hosts的目录
select_jump_directory() {
    local dirs
    dirs=$(find_jump_directories)

    if [ -z "$dirs" ]; then
        echo "错误:在 $ROOT_DIR 下未找到任何jump_hosts文件"
        exit 1
    fi

    # 显示目录列表(通过环境变量已禁用鼠标)
    echo "$dirs" | fzf \
        --prompt "选择包含jump_hosts的目录(按ESC取消) > " \
        --height 100% \
        --border=rounded \
        --margin "2,25" \
        --no-preview
}

# 从选定目录的jump_hosts中选择主机(支持返回上一级)
select_host_from_directory() {
    local selected_dir="$1"
    local host_file="${selected_dir}/jump_hosts"

    if [ ! -f "$host_file" ]; then
        echo "错误:文件 $host_file 不存在"
        return 1
    fi

    # 在主机列表顶部添加"[返回上一级]"选项
    (echo "[返回上一级]"; cat "$host_file") | fzf \
        --prompt "选择要登录的主机(选[返回上一级]回到目录选择) > " \
        --height 100% \
        --border=rounded \
        --margin "2,5" \
        --no-preview | awk '{print $1}'
}

# 主流程(支持循环返回)
main() {
    local selected_dir
    local selected_host

    while true; do
        # 第一步:选择目录
        selected_dir=$(select_jump_directory)
        if [ -z "$selected_dir" ] || [ ! -d "$selected_dir" ]; then
            echo "未选择有效目录,退出"
            exit 0
        fi
        echo "已选择目录:$selected_dir"

        # 第二步:选择主机(可能返回上一级)
        selected_host=$(select_host_from_directory "$selected_dir")
        if [ -z "$selected_host" ]; then
            echo "未选择主机,退出"
            exit 0
        fi

        # 处理返回上一级操作
        if [ "$selected_host" = "[返回上一级]" ]; then
            echo "返回目录选择..."
            continue  # 回到循环开始,重新选择目录
        fi

        # 第三步:连接主机
        echo "正在连接 $selected_host ..."
        ssh "$selected_host"  # 若用jms则替换为:jms connect "$selected_host"
        break  # 连接完成后退出脚本
    done
}

# 启动程序
main

jj7

#!/bin/bash
export LANG=C
# 全局禁用fzf鼠标支持(兼容旧版本fzf)
export FZF_DEFAULT_OPTS="--no-mouse"

# 主目录设置为/root
ROOT_DIR="/root"

# 查找/root目录下所有包含jump_hosts文件的子目录
find_jump_directories() {
    find "$ROOT_DIR" -type f -name "jump_hosts" -print0 2>/dev/null | while IFS= read -r -d '' file; do
        dirname "$file"
    done | sort -u
}

# 选择包含jump_hosts的目录
select_jump_directory() {
    local dirs
    dirs=$(find_jump_directories)

    if [ -z "$dirs" ]; then
        echo "错误:在 $ROOT_DIR 下未找到任何jump_hosts文件"
        exit 1
    fi

    # 显示目录列表(通过环境变量已禁用鼠标)
    echo "$dirs" | fzf \
        --prompt "选择包含jump_hosts的目录(按ESC取消) > " \
        --height 100% \
        --border=rounded \
        --margin "2,25" \
        --reverse \
        --no-preview
}

# 从选定目录的jump_hosts中选择主机(支持返回上一级)
select_host_from_directory() {
    local selected_dir="$1"
    local host_file="${selected_dir}/jump_hosts"

    if [ ! -f "$host_file" ]; then
        echo "错误:文件 $host_file 不存在"
        return 1
    fi

    # 在主机列表顶部添加"[返回上一级]"选项
    (echo "[返回上一级]"; cat "$host_file") | fzf \
        --prompt "选择要登录的主机(选[返回上一级]回到目录选择) > " \
        --height 100% \
        --border=rounded \
        --margin "2,5" \
        --reverse \
        --no-preview | awk '{print $1}'
}

# 主流程(支持循环返回)
main() {
    local selected_dir
    local selected_host

    while true; do
        # 第一步:选择目录
        selected_dir=$(select_jump_directory)
        if [ -z "$selected_dir" ] || [ ! -d "$selected_dir" ]; then
            echo "未选择有效目录,退出"
            exit 0
        fi
        echo "已选择目录:$selected_dir"

        # 第二步:选择主机(可能返回上一级)
        selected_host=$(select_host_from_directory "$selected_dir")
        if [ -z "$selected_host" ]; then
            echo "未选择主机,退出"
            exit 0
        fi

        # 处理返回上一级操作
        if [ "$selected_host" = "[返回上一级]" ]; then
            echo "返回目录选择..."
            continue  # 回到循环开始,重新选择目录
        fi

        # 第三步:连接主机
        echo "正在连接 $selected_host ..."
        ssh "$selected_host"  # 若用jms则替换为:jms connect "$selected_host"
        break  # 连接完成后退出脚本
    done
}

# 启动程序
main

  

posted @ 2026-06-23 10:58  ZANAN  阅读(5)  评论(0)    收藏  举报