diff --git a/mount-all.sh b/mount-all.sh new file mode 100644 index 0000000..9221f5f --- /dev/null +++ b/mount-all.sh @@ -0,0 +1,163 @@ +#!/bin/bash + +# ============================================================ +# SSHFS Manager +# 要新增或修改的話,就只要編輯這裡: +# 格式:"名稱|使用者@主機:遠端路徑|本地掛載點" +# ============================================================ +ENTRIES=( + "janet-mac-mini | janet@192.168.1.103:/ | $HOME/mnt/janet-mac-mini" + "nas2 | wiwi@192.168.1.114:/ | $HOME/mnt/nas2" + "nas3 | wiwi@192.168.1.111:/ | $HOME/mnt/nas3" + "99 | wiwi@192.168.1.99:/ | $HOME/mnt/99" + "88 | wiwi@192.168.1.88:/ | $HOME/mnt/88" + "nas1 | wiwi@192.168.1.105:/ | $HOME/mnt/nas1" +) +# ============================================================ + +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