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

浙公网安备 33010602011771号