160 lines
5.2 KiB
Bash
160 lines
5.2 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
# ============================================================
|
|||
|
|
# SSHFS Manager
|
|||
|
|
# 要新增或修改的話,就只要編輯這裡:
|
|||
|
|
# 格式:"名稱|使用者@主機:遠端路徑|本地掛載點"
|
|||
|
|
# ============================================================
|
|||
|
|
ENTRIES=(
|
|||
|
|
"nas2 | wiwi@192.168.1.114:/ | $HOME/mnt/nas2"
|
|||
|
|
"nas3 | wiwi@192.168.1.111:/ | $HOME/mnt/nas3"
|
|||
|
|
)
|
|||
|
|
# ============================================================
|
|||
|
|
|
|||
|
|
RED='\033[0;31m'
|
|||
|
|
GREEN='\033[0;32m'
|
|||
|
|
YELLOW='\033[1;33m'
|
|||
|
|
CYAN='\033[0;36m'
|
|||
|
|
BOLD='\033[1m'
|
|||
|
|
RESET='\033[0m'
|
|||
|
|
|
|||
|
|
get_name() { echo "$1" | awk -F'|' '{gsub(/ /,"",$1); print $1}'; }
|
|||
|
|
get_remote(){ echo "$1" | awk -F'|' '{gsub(/^ +| +$/,"",$2); print $2}'; }
|
|||
|
|
get_local() { echo "$1" | awk -F'|' '{gsub(/^ +| +$/,"",$3); print $3}'; }
|
|||
|
|
|
|||
|
|
is_mounted() { mountpoint -q "$1" 2>/dev/null; }
|
|||
|
|
|
|||
|
|
print_status() {
|
|||
|
|
echo ""
|
|||
|
|
echo -e "${BOLD} # 狀態 名稱${RESET}"
|
|||
|
|
echo " ─────────────────────────────"
|
|||
|
|
local i=1
|
|||
|
|
for entry in "${ENTRIES[@]}"; do
|
|||
|
|
local name remote local_path
|
|||
|
|
name=$(get_name "$entry")
|
|||
|
|
local_path=$(get_local "$entry")
|
|||
|
|
remote=$(get_remote "$entry")
|
|||
|
|
if is_mounted "$local_path"; then
|
|||
|
|
printf " ${BOLD}%d${RESET} ${GREEN}✔ 已掛${RESET} %-20s ${CYAN}%s${RESET}\n" "$i" "$name" "$remote"
|
|||
|
|
else
|
|||
|
|
printf " ${BOLD}%d${RESET} ${RED}✘ 未掛${RESET} %-20s ${CYAN}%s${RESET}\n" "$i" "$name" "$remote"
|
|||
|
|
fi
|
|||
|
|
((i++))
|
|||
|
|
done
|
|||
|
|
echo ""
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
do_mount() {
|
|||
|
|
local entry="$1"
|
|||
|
|
local name remote local_path
|
|||
|
|
name=$(get_name "$entry")
|
|||
|
|
remote=$(get_remote "$entry")
|
|||
|
|
local_path=$(get_local "$entry")
|
|||
|
|
|
|||
|
|
if is_mounted "$local_path"; then
|
|||
|
|
echo -e "${YELLOW}$name 已經掛載了,跳過。${RESET}"
|
|||
|
|
return
|
|||
|
|
fi
|
|||
|
|
mkdir -p "$local_path"
|
|||
|
|
echo -e "掛載 ${BOLD}$name${RESET} ($remote → $local_path) ..."
|
|||
|
|
if sshfs "$remote" "$local_path"; then
|
|||
|
|
echo -e "${GREEN}✔ 成功${RESET}"
|
|||
|
|
else
|
|||
|
|
echo -e "${RED}✘ 失敗${RESET}"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
do_umount() {
|
|||
|
|
local entry="$1"
|
|||
|
|
local name local_path
|
|||
|
|
name=$(get_name "$entry")
|
|||
|
|
local_path=$(get_local "$entry")
|
|||
|
|
|
|||
|
|
if ! is_mounted "$local_path"; then
|
|||
|
|
echo -e "${YELLOW}$name 本來就沒掛載,跳過。${RESET}"
|
|||
|
|
return
|
|||
|
|
fi
|
|||
|
|
echo -e "卸載 ${BOLD}$name${RESET} ..."
|
|||
|
|
if fusermount -u "$local_path"; then
|
|||
|
|
echo -e "${GREEN}✔ 成功${RESET}"
|
|||
|
|
else
|
|||
|
|
echo -e "${RED}✘ 失敗${RESET}"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
parse_selection() {
|
|||
|
|
local input="$1"
|
|||
|
|
local max="$2"
|
|||
|
|
local result=()
|
|||
|
|
IFS=',' read -ra parts <<< "$input"
|
|||
|
|
for part in "${parts[@]}"; do
|
|||
|
|
part=$(echo "$part" | tr -d ' ')
|
|||
|
|
if [[ "$part" =~ ^[0-9]+-[0-9]+$ ]]; then
|
|||
|
|
local start="${part%-*}" end="${part#*-}"
|
|||
|
|
for ((n=start; n<=end && n<=max; n++)); do result+=("$n"); done
|
|||
|
|
elif [[ "$part" =~ ^[0-9]+$ ]] && (( part >= 1 && part <= max )); then
|
|||
|
|
result+=("$part")
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
echo "${result[@]}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# ── 主迴圈 ──────────────────────────────────────────────────
|
|||
|
|
clear
|
|||
|
|
while true; do
|
|||
|
|
echo -e "${BOLD}╔══════════════════════════════╗${RESET}"
|
|||
|
|
echo -e "${BOLD}║ SSHFS Manager ║${RESET}"
|
|||
|
|
echo -e "${BOLD}╚══════════════════════════════╝${RESET}"
|
|||
|
|
|
|||
|
|
print_status
|
|||
|
|
|
|||
|
|
echo -e " ${BOLD}m[編號]${RESET} 掛載 ${BOLD}u[編號]${RESET} 卸載 ${BOLD}a${RESET} 全掛 ${BOLD}x${RESET} 全卸 ${BOLD}q${RESET} 離開"
|
|||
|
|
echo -e " (例如:${BOLD}m5${RESET}、${BOLD}m1-3${RESET}、${BOLD}u1,4,5${RESET})"
|
|||
|
|
echo ""
|
|||
|
|
read -rp " 選擇操作:" action
|
|||
|
|
|
|||
|
|
# 把 action 拆成「指令字母」和「後面的參數」
|
|||
|
|
cmd="${action:0:1}"
|
|||
|
|
arg="${action:1}"
|
|||
|
|
|
|||
|
|
case "$cmd" in
|
|||
|
|
q|Q) echo "掰~"; exit 0 ;;
|
|||
|
|
|
|||
|
|
a|A)
|
|||
|
|
for entry in "${ENTRIES[@]}"; do do_mount "$entry"; done
|
|||
|
|
;;
|
|||
|
|
|
|||
|
|
x|X)
|
|||
|
|
for entry in "${ENTRIES[@]}"; do do_umount "$entry"; done
|
|||
|
|
;;
|
|||
|
|
|
|||
|
|
m|M)
|
|||
|
|
if [[ -z "$arg" ]]; then
|
|||
|
|
print_status
|
|||
|
|
echo -e " 要掛載哪幾個?(輸入編號,可用逗號或範圍,例如 1,3 或 1-3)"
|
|||
|
|
read -rp " > " arg
|
|||
|
|
fi
|
|||
|
|
indices=$(parse_selection "$arg" "${#ENTRIES[@]}")
|
|||
|
|
for i in $indices; do
|
|||
|
|
do_mount "${ENTRIES[$((i-1))]}"
|
|||
|
|
done
|
|||
|
|
;;
|
|||
|
|
|
|||
|
|
u|U)
|
|||
|
|
if [[ -z "$arg" ]]; then
|
|||
|
|
print_status
|
|||
|
|
echo -e " 要卸載哪幾個?(輸入編號,可用逗號或範圍,例如 1,3 或 1-3)"
|
|||
|
|
read -rp " > " arg
|
|||
|
|
fi
|
|||
|
|
indices=$(parse_selection "$arg" "${#ENTRIES[@]}")
|
|||
|
|
for i in $indices; do
|
|||
|
|
do_umount "${ENTRIES[$((i-1))]}"
|
|||
|
|
done
|
|||
|
|
;;
|
|||
|
|
|
|||
|
|
*)
|
|||
|
|
echo -e "${RED}看不懂,請輸入 m / u / a / x / q${RESET}"
|
|||
|
|
sleep 1 ;;
|
|||
|
|
esac
|
|||
|
|
done
|