2026年9月7日 星期一

自動掛載 VeraCrypt 加密虛擬磁碟檔案(容器)的 Mac Shell 指令碼。

使用蘋果電腦以後,不能使用以前習慣的 bat 批次檔執行指令,好像變得比較麻煩不直覺,後來經過一番閱讀發現其實也還好,這邊以最近用到加密容器掛載需求為例:

步驟 1:建立自動化指令碼
打開 Mac 的 文字編輯機 App。
按下快速鍵 Shift + Cmd + T 將文字格式轉為純文字。
複製並貼上以下程式碼,存檔為 mount.sh:

步驟 2:賦予執行權限
Mac 出於安全考量,預設不允許直接執行點擊的指令碼。請打開終端機 (Terminal) 並輸入以下指令授予檔案執行權限:
chmod +x ~/Documents/mount.sh
chmod +x ~/Desktop/dismount_all.sh

步驟 3:如何一鍵執行?
如果希望像 Windows 一樣雙擊滑鼠就能執行,在 mount.sh 檔案上按右鍵選擇「取得資訊」,將「開啟檔案的應用程式」修改為「終端機.app」。

掛載預先指定加密容器
================ 以下為 mount.sh (放在文件檔案夾)範例 ================
#!/bin/bash

# 1. --- 請修改您的容器路徑與掛載名稱 ---
CONTAINER_PATH="/Users/您的用戶名/Documents/加密容器.hc"
VOLUME_NAME="VeraCrypt_Drive"
# ---------------------------------

# 2. 彈出 macOS 原生密碼輸入視窗
PASSWORD=$(osascript -e 'display dialog "請輸入 VeraCrypt 容器密碼:" default answer "" with hidden answer buttons {"取消", "確定"} default button "確定"' -e 'text returned of result' 2>/dev/null)

# 3. 如果使用者點擊取消或沒輸入,則直接退出
if [ -z "$PASSWORD" ]; then
    exit 0
fi

# 4. 使用 printf 代替 echo(防止自動加換行符號),並用 --stdin 參數代替 --password=-,相容性與穩定度更高。
# 5. 視需求選擇是否加上 --truecrypt 開啟 TrueCrypt 檔案,或使用 -m ro 開啟唯獨模式。
# 6. (使用 2>&1 將錯誤訊息存入 ERROR_MSG 變數中)
ERROR_MSG=$(printf "%s" "$PASSWORD" | /Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --text --truecrypt -m ro --non-interactive --stdin --mount "$CONTAINER_PATH" "/Volumes/$VOLUME_NAME" 2>&1)

# 7. 檢查掛載狀態 (0 代表成功)
if [ $? -eq 0 ]; then
    # 8. 成功:清除密碼、自動開啟 Finder
    unset PASSWORD
    open "/Volumes/$VOLUME_NAME"
else
    # 9. 失敗:清除密碼、將錯誤訊息用視窗彈出
    unset PASSWORD
   
    # 10. 整理錯誤訊息格式,避免換行字元與引號影響 AppleScript
    CLEAN_ERROR=$(echo "$ERROR_MSG" | tr '\n' ' ' | sed "s/\"/'/g")
   
    osascript -e "display alert \"掛載失敗\" message \"VeraCrypt 系統回報錯誤:\n\n$CLEAN_ERROR\" as critical"
fi
================ 以上為 mount.sh (放在文件檔案夾)範例 ================

一次卸載所有加密容器
================ 以下為 dismount_all.sh (放在桌面)範例 ================
#!/bin/bash

# 1. 執行全局解除掛載指令 (不帶任何路徑,代表全部彈出)
# 加上 --force 參數,可以防止某些輕微的系統佔用導致彈出失敗
ERROR_MSG=$(/Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --text --non-interactive --dismount --force 2>&1)

# 檢查卸載狀態 (0 代表成功)
if [ $? -eq 0 ]; then
    # 2. 成功:跳出通知
    osascript -e 'display alert "全部解除掛載成功" message "所有 VeraCrypt / TrueCrypt 容器已安全關閉並全數登出。" buttons {"確定"} default button "確定"'
else
    # 3. 失敗:將錯誤訊息彈出
    CLEAN_ERROR=$(echo "$ERROR_MSG" | tr '\n' ' ' | sed "s/\"/'/g")
   
    # 如果其實本來就沒有掛載任何東西,VeraCrypt 會報錯,這裡做個防呆提示
    if [[ "$CLEAN_ERROR" == *"No volume mounted"* ]]; then
        osascript -e 'display alert "提示" message "目前系統中沒有任何已掛載的加密容器。" buttons {"確定"}'
    else
        osascript -e "display alert \"全部解除掛載失敗\" message \"無法完全關閉所有磁碟。\n\n系統回報:$CLEAN_ERROR\" as critical"
    fi
fi
================ 以上為 dismount_all.sh (放在桌面)範例 ================

這樣一番設定後,就可以直接在 Macbook 點二下執行想要的動作了。