其實我是一個懶的寫Blog的人。 那為什麼還要寫,因為有一天我可能會失憶。
SFTPGo Logo and Interface

/* 1. 全局置中與字型 */
.blog-post-content { max-width: 900px; margin: 0 auto; line-height: 1.8; color: #2c3e50; font-family: "Microsoft JhengHei", "Heiti TC", sans-serif !important; }
.nav-btn, .tag-pill, .section-title { font-family: "Microsoft JhengHei", sans-serif !important; }
/* 2. 圖片容器 */
.img-container, .separator { text-align: center; margin: 40px 0; clear: both; }
/* 強制圖片 S1600 滿版 */
.img-container img, .separator img { width: 100% !important; height: auto !important; display: block; margin: 0 auto; box-shadow: 0 6px 20px rgba(0,0,0,0.12); border-radius: 8px; }
/* 3. 預留位 (僅手動觸發時出現) */
.img-placeholder { border: 3px dashed #bbdefb; background: #e3f2fd; color: #1565c0; padding: 40px; text-align: center; border-radius: 8px; font-weight: bold; margin: 20px 0; cursor: pointer; }
/* 4. 組件與導流 */
.section-title { background: linear-gradient(90deg, #e3f2fd 0%, #bbdefb 100%); color: #0d47a1; padding: 15px 25px; border-left: 6px solid #1565c0; font-size: 1.6em; font-weight: bold; margin-top: 50px; margin-bottom: 25px; }
.terminal-code { background: #263238; color: #eceff1; padding: 20px; border-radius: 6px; overflow-x: auto; font-family: Consolas, Monaco, monospace; border: 1px solid #455a64; white-space: pre-wrap; word-break: break-all; margin: 20px 0; }
.cmd-comment { color: #81c784; font-style: italic; display: block; margin-bottom: 5px; margin-top: 10px; }
.cmd-comment:first-child { margin-top: 0; }
/* 導讀區塊 */
.guide-box { background: #e3f2fd; border-left: 5px solid #1565c0; padding: 20px; margin: 0 0 30px 0; border-radius: 4px; }
.internal-promo-box { background: #f3e5f5; border: 2px solid #ce93d8; padding: 25px; border-radius: 8px; margin: 0 0 40px 0; }
.label-badge { background: #8e24aa; color: white; padding: 4px 12px; border-radius: 4px; font-size: 0.85em; vertical-align: middle; margin-right: 10px; }
.promo-divider { height: 1px; background: #e1bee7; margin: 15px 0; }
.summary-card { background: #e0f2f1; border-left: 8px solid #009688; padding: 30px; margin: 50px 0; border-radius: 4px; }
/* 文末感謝 */
.thank-you-box { background: #fff8e1; border: 2px dashed #ffb300; border-radius: 12px; margin-top: 50px; padding: 25px; text-align: center; clear: both; }
/* 底部按鈕 (Unicode 修復) */
.bottom-nav { display: flex; justify-content: space-between; flex-wrap: wrap; margin-top: 50px; margin-bottom: 30px; gap: 15px; }
.nav-btn { flex: 1; min-width: 280px; padding: 20px; border-radius: 8px; text-decoration: none; transition: all 0.3s; box-shadow: 0 2px 5px rgba(0,0,0,0.08); border: 1px solid #cfd8dc; display: block; }
.nav-btn:hover { transform: translateY(-3px); box-shadow: 0 8px 15px rgba(0,0,0,0.1); }
.nav-btn strong { display: block; font-size: 1.1em; margin-top: 5px; color: #37474f; }
.nav-prev { background: #eceff1; border-left: 5px solid #78909c; text-align: left; }
.nav-prev::before { content: "\2B05 上一篇 / 系列回顧"; font-size: 0.9em; color: #607d8b; display: block; margin-bottom: 5px; font-weight: bold; }
.nav-next { background: #e3f2fd; border-right: 5px solid #1976d2; text-align: right; }
.nav-next::before { content: "下一篇 / 延伸閱讀 \27A1"; font-size: 0.9em; color: #1e88e5; display: block; margin-bottom: 5px; font-weight: bold; }
/* 標籤雲 */
.tag-section { margin-top: 30px; padding-top: 20px; border-top: 1px solid #eee; display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.tag-header { font-weight: bold; color: #e65100; margin-right: 10px; font-size: 1.1em; }
.tag-pill { background: #f3e5f5; color: #8e44ad; padding: 8px 16px; border-radius: 20px; font-weight: bold; text-decoration: none; font-size: 0.95em; transition: background 0.2s; white-space: nowrap; border: 1px solid #e1bee7; }
.alert-box { background: #ffebee; border-left: 5px solid #d32f2f; padding: 20px; border-radius: 4px; color: #b71c1c; margin: 20px 0; }
/* --- SFTPGo 專用樣式 --- */
.terminal-sftpgo {
background-color: #263238;
color: #eceff1;
padding: 20px;
border-radius: 6px;
font-family: "Consolas", "Monaco", monospace;
font-size: 14px;
line-height: 1.7;
margin: 25px 0;
overflow-x: auto;
border: 1px solid #455a64;
white-space: pre-wrap;
word-wrap: break-word;
box-shadow: 0 4px 10px rgba(0,0,0,0.15);
}
.sftpgo-table { width: 100%; border-collapse: collapse; margin: 20px 0; }
.sftpgo-table th { background-color: #0d47a1; color: white; padding: 12px; text-align: left; font-weight: bold; }
.sftpgo-table td { padding: 12px; border-bottom: 1px solid #ddd; }
.sftpgo-table tr:nth-child(even) { background-color: #f5f5f5; }
.sftpgo-table tr:hover { background-color: #e3f2fd; }
.knowledge-box-blue { background-color: #e3f2fd; border-left: 5px solid #1976d2; padding: 20px; color: #0d47a1; border-radius: 4px; margin: 25px 0; }
.knowledge-box-green { background-color: #f1f8e9; border-left: 5px solid #558b2f; padding: 20px; color: #33691e; border-radius: 4px; margin: 25px 0; }
.success-box { background-color: #e8f5e9; border-left: 5px solid #2e7d32; padding: 25px; color: #1b5e20; border-radius: 4px; margin: 30px 0; }
.caption { display: block; margin-top: 15px; color: #888; font-size: 0.9em; font-style: italic; text-align: center; }
/* Badge Colors */
.badge-blue { background: #1976d2; }
.badge-green { background: #2e7d32; }


📚 延伸閱讀:相關技術系列



📝 SFTP 伺服器完全指南
SFTPGo 2.7.0 從零到可用的完整攻略

這是一份從乾淨系統到完全可用的實戰紀錄。涵蓋:



  • 系統準備 - Python3、curl、防火牆設定

  • SFTPGo 安裝 - Yum repo + systemd 啟動

  • 目錄規劃 - /var/sftp 架構設計

  • WebAdmin 設定 - 群組、使用者、權限管理

  • 日誌落地 - 輪替、壓縮、容量控制

  • 中文化 - en 繁體覆蓋 + python3 驗證


💡 為什麼選 SFTPGo?
SFTPGo vs 傳統 OpenSSH SFTP


傳統做法是在 Linux 上開啟 OpenSSH SFTP 服務,配合系統帳號管理檔案存取。但這種方式面臨:



  • ❌ 需要為每個使用者建立系統帳號(成本高)

  • ❌ 權限管理分散在系統層、難以維護

  • ❌ 無統一的 Web 介面,管理全靠 SSH 指令

  • ❌ 無法進行細粒度權限控制(誰能看哪個資料夾)

  • ❌ 日誌分散,難以追蹤登入/上下載行為



SFTPGo 優勢:



  • ✅ Web 管理介面 - 無需 SSH 即可管理使用者

  • ✅ 虛擬資料夾 - 靈活配置使用者看得到的路徑

  • ✅ 完整日誌 - JSON 格式記錄所有連線/操作

  • ✅ 自動輪替 - 日誌自動壓縮、封頂容量

  • ✅ 中文化支援 - 開源社群提供繁中翻譯


SFTPGo 官方介面示意
第一章:系統準備
1.1 檢查系統版本與架構
執行以下指令確認環境:
cat /etc/os-release
uname -m
1.2 安裝必要工具
SFTPGo 需要 Python 3 與 curl:
sudo dnf install -y python3 curl
python3 --version
curl --version
✅ 用途說明

  • Python 3:驗證 JSON 格式(中文化時用 `python3 -m json.tool`)

  • curl:下載官方 Yum repo 檔案


1.3 防火牆設定(若有 firewalld)
# 檢查 firewalld 狀態
sudo systemctl is-active firewalld
# 若顯示 active,執行以下開放埠
sudo firewall-cmd --permanent --add-port=2022/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
# 驗證規則生效
sudo firewall-cmd --list-ports
第二章:安裝 SFTPGo
2.1 建立官方 Yum repo
ARCH=$(uname -m)
curl -sS https://ftp.osuosl.org/pub/sftpgo/yum/${ARCH}/sftpgo.repo | sudo tee /etc/yum.repos.d/sftpgo.repo
2.2 安裝 SFTPGo 套件
sudo dnf install -y sftpgo
2.3 啟動服務
# 啟動 + 開機自啟
sudo systemctl start sftpgo
sudo systemctl enable sftpgo
# 檢查狀態
sudo systemctl status sftpgo --no-pager
2.4 驗證埠監聽
確認 SFTP (2022) 和 WebAdmin (8080) 埠已啟用:
ss -lntp | egrep ':(2022|8080)\b'
SFTPGo 服務正常執行,埠已監聽
第三章:目錄規劃與權限設定
3.1 目錄結構設計
推薦以下結構(最佳實踐):
/var/sftp/
├── users/ # 使用者家目錄區
│ ├── aaa/ # 使用者 aaa 自動生成
│ ├── bbb/ # 使用者 bbb 自動生成
│ └── ...
└── share/ # 全員共用區
3.2 建立目錄結構
sudo mkdir -p /var/sftp/users /var/sftp/share
3.3 設定所有人與權限
SFTPGo 必須是目錄擁有者才能讀寫:
# 設定擁有者為 sftpgo
sudo chown -R sftpgo:sftpgo /var/sftp
# 設定權限(750 = 擁有者完全、群組讀執行、其他無權限)
sudo chmod 0750 /var/sftp
sudo chmod 0750 /var/sftp/users
# share 目錄設為 770(多人可寫)
sudo chmod 0770 /var/sftp/share
✅ 驗證重點

  • owner 和 group 都是 sftpgo

  • /var/sftp 與 /var/sftp/users 為 750

  • /var/sftp/share 為 770(多人寫入)


截目錄權限設定完成,所有者為 sftpgo
第四章:WebAdmin 初始設定
4.1 開啟 WebAdmin 介面
用瀏覽器訪問:
http://<主機IP>:8080/web/admin
例如:http://192.168.120.111:8080/web/admin
WebAdmin 首次進入,需建立第一個管理員
4.2 建立管理員帳號
首次登入時會自動進入 Setup,填入:
  • Username:admin(或自訂)

  • Password:設定強密碼

  • 點擊 Submit 後會自動登入,2FA 提示可選擇 Skip。
    建立第一個管理員成功 (2FA 可選擇略過或設定)
    4.3 建立 Primary 群組(重點)
    群組可以統一套用設定給多個使用者,避免逐一手動設定。
    步驟:
  • 點擊左側選單 Groups

  • 點擊 Add group 按鈕

  • 填入以下欄位:



  • 欄位

    說明


    Name
    Primary
    群組名稱(必填)


    File system
    Local disk
    存儲類型


    Storage
    Local disk
    存儲提供者


    Root directory
    /var/sftp/users/%username%
    【重點】%username% 會自動替換為帳號


    Download buffer
    0
    保留預設


    Upload buffer
    0
    保留預設


    點擊 Submit 儲存群組。
    建立 Primary 群組,設定 Root directory 為 /var/sftp/users/%username%
    4.4 建立測試使用者
    步驟:
  • 點擊左側選單 Users

  • 點擊 Add user 按鈕

  • 填入必要欄位:



  • 欄位

    說明


    Username
    aaa
    使用者帳號(測試用,可自訂)


    Password
    輸入密碼
    或用 Public Key(二選一)


    Primary group
    Primary
    指定剛建的 Primary 群組


    點擊 Submit 建立使用者。
    建立測試使用者 aaa
    4.5 用 SFTP 測試登入與上傳
    在本機或任何可連到主機的 Linux 機器上執行:
    sftp -P 2022 aaa@127.0.0.1
    # 進入 SFTP 提示符後,試著上傳檔案:
    > put /path/to/testfile.txt
    > ls
    > exit
    預期行為:
  • ✅ 第一次登入時,SFTPGo 自動建立 /var/sftp/users/aaa/

  • ✅ 檔案上傳成功

  • ✅ 查看檔案列表正常

  • 4.6 驗證檔案與權限
    在伺服器上檢查:
    ls -l /var/sftp/users/aaa/
    使用者檔案已成功上傳到 /var/sftp/users/aaa/
    ✅ WebAdmin 基本設定完成
    使用者已可透過 SFTP 登入並上傳檔案,目錄自動建立工作正常。
    第五章:日誌設定(含輪替)
    5.1 建立日誌目錄
    sudo mkdir -p /var/log/sftpgo
    sudo chown -R sftpgo:sftpgo /var/log/sftpgo
    sudo chmod 0750 /var/log/sftpgo
    5.2 建立環境變數檔(日誌參數)
    日誌參數透過環境變數控制,SFTPGo 官方推薦此方式:
    sudo tee /etc/sftpgo/sftpgo.env >/dev/null <<'EOF'
    SFTPGO_LOG_FILE_PATH=/var/log/sftpgo/sftpgo.log
    SFTPGO_LOG_LEVEL=info
    SFTPGO_LOG_MAX_SIZE=100
    SFTPGO_LOG_MAX_BACKUPS=50
    SFTPGO_LOG_MAX_AGE=90
    SFTPGO_LOG_COMPRESS=true
    EOF
    參數說明:


    參數

    說明


    SFTPGO_LOG_FILE_PATH
    /var/log/sftpgo/sftpgo.log
    日誌檔案路徑


    SFTPGO_LOG_LEVEL
    info
    日誌等級(debug/info/warn/error)


    SFTPGO_LOG_MAX_SIZE
    100
    單個日誌檔大小上限(MB)


    SFTPGO_LOG_MAX_BACKUPS
    50
    保留最多 50 個備份檔


    SFTPGO_LOG_MAX_AGE
    90
    日誌保留天數


    SFTPGO_LOG_COMPRESS
    true
    備份檔自動 gzip 壓縮


    5.3 設定 systemd 讀取環境變數
    編輯 systemd override 檔案,讓 SFTPGo 載入環境變數:
    sudo systemctl edit sftpgo
    貼入以下內容(若檔案為空):
    [Service]
    EnvironmentFile=-/etc/sftpgo/sftpgo.env
    存檔後(通常 Ctrl+XYEnter)。
    5.4 重新啟動生效
    sudo systemctl daemon-reload
    sudo systemctl restart sftpgo
    5.5 驗證日誌有寫入
    # 查看日誌檔
    ls -l /var/log/sftpgo/
    tail -n 20 /var/log/sftpgo/sftpgo.log
    預期輸出: JSON 格式的日誌,包含連線/登入/檔案操作等事件。
    日誌已正常生成,JSON 格式記錄各項事件
    💡 日誌內容示例 (JSON 格式)


    SFTPGo 的日誌分為「系統訊息」與「操作紀錄」。


    ▼ 系統啟動日誌 (您目前看到的):

    {"level":"info","time":"2026-02-04T03:46:13.328","sender":"sftpd","message":"server listener registered, address: [::]:2022"}

    ▼ 使用者操作日誌 (有人登入後會出現):

    {"level":"info","time":"2026-02-04T04:00:00.123","sender":"connection","event_type":"login_success","username":"admin","client_ip":"192.168.1.10",...}

    第六章:中文化(繁體設定)
    ⚠️ 前置條件
    必須有「繁體中文的 translation.json 檔案」。若無,請先準備此檔案或用 cat/tee 建立。
    6.1 準備繁中翻譯檔
    假設你已有繁中 translation.json 放在 /root/translation.json
    # 檢查檔案是否存在
    ls -l /root/translation.json
    # 查看前 20 行,確認是繁中
    head -n 20 /root/translation.json
    預期輸出: 應看到繁體中文如「初始設定」、「登入」、「檔案」等字。
    繁中 translation.json 檔案內容確認
    6.2 驗證 JSON 語法
    用 python3 檢查 JSON 是否合法:
    python3 -m json.tool /root/translation.json >/dev/null
    echo $?
    預期輸出: 0 表示語法正確;若有錯會直接報錯行列。
    6.3 找到 en 翻譯檔位置
    find / -path '*/static/locales/en/translation.json' 2>/dev/null
    預期輸出: /usr/share/sftpgo/static/locales/en/translation.json
    6.4 備份原始 en(英文版)
    sudo cp -a /usr/share/sftpgo/static/locales/en/translation.json \
    /usr/share/sftpgo/static/locales/en/translation.json.bak
    6.5 覆蓋 en 成繁中
    sudo cp -a /root/translation.json \
    /usr/share/sftpgo/static/locales/en/translation.json
    6.6 再驗一次(已套用的 en)
    python3 -m json.tool /usr/share/sftpgo/static/locales/en/translation.json >/dev/null
    echo $?
    預期輸出: 0
    6.7 重啟 SFTPGo
    sudo systemctl restart sftpgo
    6.8 備份「已套用的繁中 en」到 /root(含日期)
    sudo cp -a /usr/share/sftpgo/static/locales/en/translation.json \
    "/root/sftpgo.translation.zh-TW.$(date +%F_%H%M%S).json"
    6.9 驗證備份檔
    ls -l /root/sftpgo.translation.zh-TW.*.json
    6.10 清瀏覽器快取並驗證
  • 進 WebAdmin:http://<主機IP>:8080/web/admin

  • F12 開啟開發者工具 → 應用程式 → 本機存儲 → 清除該站台的 localStorage(特別是 i18next* 開頭的項)

  • 重新整理頁面

  • 預期:UI 應顯示繁體中文(「登入」、「檔案」、「使用者」等)

  • 中文化成功!UI 已顯示繁體中文

    繁體中文語系檔 (translation.json)



    Blogger 無法直接下載檔案。請複製下方內容,在伺服器建立檔案:
    vim /root/translation.json



    🔽 點擊展開 100+ 行核心 JSON 翻譯 (一鍵複製)





    * 這是「核心精華版」翻譯,已涵蓋 SFTPGo 90% 的 WebAdmin 常用介面。
    若您有完整 750 行的自定義翻譯,請將其貼上並取代上方程式碼區塊的內容。



    ✅ 中文化完成
    SFTPGo Web 介面已切換為繁體中文,所有選單、按鈕、提示訊息均為繁中。
    系統完整安裝完成 SFTPGo 2.7.0 已完全可用,包含:

    • ✅ SFTP 服務(2022 埠)

    • ✅ WebAdmin 管理介面(8080 埠)

    • ✅ 使用者群組管理

    • ✅ 日誌落地與輪替

    • ✅ 繁體中文化


    第七章:常見問題與故障排除
    Q1. 使用者無法自動建立 home dir
    症狀:使用者登入後,/var/sftp/users 底下沒有對應的使用者資料夾。
    解決步驟:
  • 確認 /var/sftp/users 權限:

    ls -ld /var/sftp/users
    # 必須顯示:drwxr-x---. ... sftpgo sftpgo


  • 確認 sftpgo 服務正常運行:

    systemctl status sftpgo --no-pager


  • 檢查日誌是否有錯誤:

    tail -f /var/log/sftpgo/sftpgo.log | grep -i error


  • Q2. 中文化後仍顯示英文
    症狀:UI 仍然是英文,沒有變繁中。
    解決步驟:
  • 確認 en/translation.json 已覆蓋:

    head -n 5 /usr/share/sftpgo/static/locales/en/translation.json
    # 應看到繁中如「初始設定」等


  • 清除瀏覽器快取(最常見原因):

    • 按 F12 開發者工具

    • 應用程式 → 本機存儲

    • 刪除所有 i18next* 開頭的項目



  • 完全關閉瀏覽器後重新開啟

  • Q3. WebAdmin 無法連線
    症狀:http://IP:8080/web/admin 無回應或連線被拒。
    解決步驟:
  • 確認防火牆開放 8080:

    sudo firewall-cmd --list-ports | grep 8080


  • 確認 sftpgo 是否啟動:

    systemctl status sftpgo --no-pager


  • 驗證埠監聽:

    ss -lntp | grep 8080


  • 查看啟動日誌:

    journalctl -u sftpgo -n 50 --no-pager


  • Q4. SFTP 連線被拒
    症狀:sftp -P 2022 user@host 無法連線。
    解決步驟:
  • 確認防火牆開放 2022:

    sudo firewall-cmd --list-ports | grep 2022


  • 驗證帳號密碼正確(在 WebAdmin 確認使用者存在)

  • 查看日誌:

    tail -f /var/log/sftpgo/sftpgo.log | grep -i connection


  • Q5. JSON 驗證失敗
    症狀:python3 -m json.tool 報錯(少逗號、引號不成對等)。
    解決步驟:
  • 用文字編輯器開啟 translation.json,尋找錯誤位置(通常在報錯行號附近)

  • 常見問題:

    • 少逗號(,)在某個 key-value 對後

    • 引號(")沒有成對

    • 中文字前後有多餘空格



  • 修正後重新驗證:

    python3 -m json.tool /root/translation.json >/dev/null
    echo $? # 應回傳 0


  • Q6. 日誌沒有寫入
    症狀:/var/log/sftpgo/sftpgo.log 不存在或一直是空的。
    解決步驟:
  • 確認環境變數檔存在:

    cat /etc/sftpgo/sftpgo.env


  • 檢查 systemd drop-in 是否正確:

    systemctl cat sftpgo | grep -A 5 EnvironmentFile


  • 重新加載並重啟:

    sudo systemctl daemon-reload
    sudo systemctl restart sftpgo


  • 等待 5 秒後檢查日誌:

    sleep 5
    ls -l /var/log/sftpgo/
    tail -n 20 /var/log/sftpgo/sftpgo.log


  • 第八章:升級與維護
    8.1 升級 SFTPGo 版本
    若日後要升級到新版本(例如 2.8.0):
    # 檢查可用版本
    dnf check-update | grep sftpgo
    # 執行升級
    sudo dnf upgrade sftpgo -y
    # 重啟服務
    sudo systemctl restart sftpgo
    # 驗證新版本
    sftpgo version
    ⚠️ 升級前備份
    升級前建議備份中文化的 translation.json(新版本可能更新英文檔,需要重新覆蓋繁中)。
    8.2 升級後重新套用繁中
    若升級後 en/translation.json 被重置,需要重新覆蓋:
    # 驗證你保存的繁中 JSON
    python3 -m json.tool /root/translation.json >/dev/null && echo "OK" || echo "FAIL"
    # 覆蓋新版本的 en
    sudo cp -a /root/translation.json \
    /usr/share/sftpgo/static/locales/en/translation.json
    # 驗證
    python3 -m json.tool /usr/share/sftpgo/static/locales/en/translation.json >/dev/null && echo "OK"
    # 重啟
    sudo systemctl restart sftpgo
    # 備份新的版本(含日期)
    sudo cp -a /usr/share/sftpgo/static/locales/en/translation.json \
    "/root/sftpgo.translation.zh-TW.$(date +%F_%H%M%S).json"
    8.3 日誌輪替與清理(已自動化)
    由於前面設定了 SFTPGO_LOG_MAX_BACKUPS=50,系統會自動管理日誌:
    # 查看當前日誌大小
    du -sh /var/log/sftpgo/
    # 查看備份檔數量(應不超過 50)
    ls -1 /var/log/sftpgo/sftpgo.log.* 2>/dev/null | wc -l
    # 查看備份檔(已自動 gzip 壓縮)
    ls -lh /var/log/sftpgo/
    💡 日誌輪替參數
    以目前設定,當日誌達 100MB 時會自動輪替;保留最多 50 個備份檔;超過 90 天的日誌自動刪除;備份檔自動 gzip 壓縮。這樣即使日誌很多也不會占用過多空間。
    8.4 定期檢查清單
    建議每月檢查一次系統狀態:
    # 檢查服務狀態
    systemctl status sftpgo --no-pager
    # 檢查磁碟使用
    df -h /var/sftp /var/log/sftpgo
    # 檢查日誌輪替狀況
    ls -lh /var/log/sftpgo/ | tail -n 10
    # 檢查使用者數量
    curl -s http://127.0.0.1:8080/web/admin/users | wc -l
    # 檢查備份檔(確保 en.translation.json 已妥善備份)
    ls -l /root/sftpgo.translation.zh-TW.*.json
    附錄 A:快速參考
    A1. 重要目錄與檔案


    路徑
    用途


    /var/sftp/users/
    使用者家目錄儲存位置


    /var/sftp/share/
    共用區(虛擬資料夾掛載點)


    /var/log/sftpgo/sftpgo.log
    實時日誌檔案


    /etc/sftpgo/sftpgo.env
    環境變數檔(日誌參數)


    /usr/share/sftpgo/static/locales/en/translation.json
    英文翻譯檔(被覆蓋成繁中)


    /usr/share/sftpgo/static/locales/en/translation.json.bak
    原始英文備份


    /root/translation.json
    繁中翻譯檔來源


    /root/sftpgo.translation.zh-TW.*.json
    已套用版本的時間戳備份


    A2. 常用指令速查表


    功能
    指令


    啟動服務
    sudo systemctl start sftpgo


    停止服務
    sudo systemctl stop sftpgo


    重啟服務
    sudo systemctl restart sftpgo


    查看狀態
    sudo systemctl status sftpgo --no-pager


    設為開機自啟
    sudo systemctl enable sftpgo


    查看即時日誌
    sudo journalctl -u sftpgo -f


    查看日誌檔
    tail -f /var/log/sftpgo/sftpgo.log


    驗證 JSON 格式
    python3 -m json.tool /path/to/file.json


    SFTP 測試連線
    sftp -P 2022 user@host


    A3. 還原英文版本(回復繁中)
    若要回復為原始英文 UI:
    sudo cp -a /usr/share/sftpgo/static/locales/en/translation.json.bak \
    /usr/share/sftpgo/static/locales/en/translation.json
    sudo systemctl restart sftpgo
    參考文獻
    📚 SFTPGo
    安裝與部署

    系統安全與防火牆

    附錄 B:目錄結構最終樣貌
    完整安裝後,你的系統會呈現如下結構:
    # SFTPGo 資料與日誌
    /var/sftp/
    ├── users/
    │ ├── aaa/
    │ │ ├── testfile.txt
    │ │ ├── file1.ps1
    │ │ └── ...
    │ ├── bbb/
    │ │ └── ...
    │ └── ...(更多使用者)
    └── share/
    └── ...(共用檔案)
    /var/log/sftpgo/
    ├── sftpgo.log # 當前日誌
    ├── sftpgo.log.1.gz # 已輪替的壓縮備份
    ├── sftpgo.log.2.gz
    ├── sftpgo.log.3.gz
    └── ...(最多 50 個)
    /usr/share/sftpgo/static/locales/
    ├── en/
    │ ├── translation.json # 已覆蓋成繁中
    │ └── translation.json.bak # 原始英文備份
    └── it/
    └── translation.json
    /root/
    ├── translation.json # 繁中翻譯檔來源
    └── sftpgo.translation.zh-TW.2026-02-05_091500.json # 時間戳備份
    🎉 安裝完成總結
    您的 SFTPGo 2.7.0 已完全就緒!

    本次安裝涵蓋以下內容:








































    階段完成項目驗證方式
    系統準備Python3、curl、防火牆python3 --version
    SFTPGo 安裝Yum repo、systemd 啟動systemctl status sftpgo
    目錄規劃/var/sftp users/share 目錄ls -ld /var/sftp/*
    WebAdmin 設定群組、使用者、權限用 SFTP 登入測試
    日誌落地輪替、壓縮、容量控制ls -l /var/log/sftpgo/
    中文化en 繁體覆蓋、python3 驗證WebAdmin UI 顯示繁中


    ✅ 系統已可投入生產環境
    - SFTP 服務正常運行(2022 埠)
    - WebAdmin 管理介面可用(8080 埠)
    - 日誌完整記錄所有操作
    - 介面已中文化,操作便利
    - 自動輪替機制保護磁碟空間



    後續維護建議:



    • 每月檢查一次日誌輪替狀況

    • 定期備份中文化的 translation.json

    • 系統升級前先做 VM Snapshot 快照

    • 監控 /var/sftp 磁碟使用率,必要時清理舊檔案






    🚀 2026/06/30【後續補充】SFTPGo 2.7.4 Windows 版:一鍵功能全開與繁體中文化



    除了前面介紹的 Rocky Linux 環境,後續我們也測試了 Windows 版本的 2.7.4,確認此版本已徹底修正舊版(2.7.0)升級後前端欄位缺失與 UI 跑位的盲點。
    若您改為部署在 Windows Server 上,請忽略前文的 Linux 設定,直接參考以下三大步驟,實現全方位功能封頂:



    1️⃣ 繁體中文語系檔 (translation.json)



    Blogger 無法直接提供檔案下載。請複製下方內容,在伺服器建立/覆蓋以下檔案:
    C:\ProgramData\SFTPGo\static\locales\en\translation.json



    🔽 點擊展開 2.7.4 完整繁體中文 JSON 翻譯 (一鍵複製)





    * 本區塊已同步對應 SFTPGo 2.7.4 核心架構,徹底修正舊版 2.7.0 升級後前端欄位缺失與 UI 跑位之邏輯盲點。




    2️⃣ Windows 伺服器【功能全開】部署腳本



    本腳本專為 Windows 環境設計,旨在一鍵解鎖所有核心與進階生產環境功能。
    全協定解鎖:自動綁定 SFTP(2022)、FTP(21)、FTPS(990)、WebDAV(5005)。
    資安防禦全開:自動啟用 Defender (防暴力破解)、白名單與全域速率限制。
    環境自動化與診斷:部署 UTF-8 唯一生產設定,重啟服務後動態驗證各大通訊埠監聽狀態。
    👉 請在 Windows 伺服器以系統管理員身分開啟 PowerShell,貼上並執行以下程式碼(或存成 setup.ps1 後執行):



    🔽 點擊展開 2.7.4 Windows PowerShell 腳本 (一鍵複製)





    * 本區塊已同步對應 SFTPGo 2.7.4 Windows 核心架構,將自動啟動進階資安防護、完成全通訊協定配置並動態驗證埠號監聽狀態。




    3️⃣ 🛡️ 附帶一提:Windows 防火牆開通指令


    執行完上述腳本後,別忘了在 PowerShell 輸入以下指令放行對應的 Port,否則外部還是連不進來:



    # 一次性放行 SFTPGo 所有需要的 Port (8080, 2022, 21, 990, 5005)
    New-NetFirewallRule -DisplayName "SFTPGo Services" -Direction Inbound -LocalPort 8080,2022,21,990,5005 -Protocol TCP -Action Allow

    [系統] Rocky Linux 遷移與建置筆記
    [實戰] Graylog 終極筆記:日誌分析系統安裝指南

    🏷️ 熱門關鍵字 (Tags)

    #SFTPGo
    #Linux
    #Rocky Linux
    #SFTP Server
    #繁體中文
    #日誌分析
    文章標籤:

    sungshu 發表在 痞客邦 留言(0) 人氣()

     
    本以為 iTransor for LINE 可以輕鬆換機,沒想到卻是災難的開始……
    從決定換手機開始,我就查了好久:Xperia 1 VI 的規格、相機表現、二手價格,好不容易下定決心入手夢寐以求的旗艦,心裡滿是期待,以為換機只是例行操作——Google 備份、iTransor 一鍵搞定。
    沒想到,災難就在那一刻悄悄展開。iTransor 無法安裝舊版 LINE、備份失敗、媒體檔案完全消失……整整兩天,我在備份中斷、版本不支援、媒體無法導出的泥沼裡打轉,這才是真正的坑。
    這篇文章,就是我在 Android 13 / 16 手機環境下,從 iTransor 失敗,到用 ADB + PowerShell 手動救回所有 LINE 照片的完整紀錄。
     
    📱 舊新手機環境對照




































    項目舊手機新手機
    型號Sony Xperia 5 IIISony Xperia 1 VI
    Android 系統版本1316
    Google Drive 備份✅ 聊天文字正常可接收備份
    iTransor for LINE 備份❌ 執行失敗無法安裝舊版 LINE
    媒體檔案救援方式改用 ADB + PowerShell 手動處理




    ⚠️ iTransor for LINE 為何會失敗
    實測過程如下:
    1.軟體要求手機安裝「舊版 LINE」才能執行完整備份
    2.但 Android 13(Xperia 5 III)與 Android 16(Xperia 1 VI)都已不支援降版安裝
    3.程式出現錯誤 ,手機沒有出現任何錯誤 但是 APP 不見
    4.備份中斷、沒有生成任何媒體檔案

    結論:

    iTransor for LINE 在 Android 13 以上無法使用,備份功能失效。


    於是,我決定走技術流──從手機裡手動把 LINE 資料夾拉出來,自己救。


    🧩 手動救援法:ADB + PowerShell
    整體思路如下:
    1️⃣ 使用 ADB 從舊手機導出 LINE 資料夾

    2️⃣ 使用 PowerShell 清理縮圖並補上副檔名

    3️⃣ 照片成功復原,完整救回所有聊天媒體


    ⚙️ PowerShell 自動整理指令


     
     





    $base="C:\ToolsApp\line\files\chats"


    # 刪除縮圖
    Get-ChildItem -Path $base -Recurse -File | Where-Object { $_.Name -match "thumb|_t" } | ForEach-Object {
        Write-Host "刪除縮圖檔案: $($_.FullName)"
        Remove-Item $_.FullName -Force
    }


    # 無副檔名改 jpg
    Get-ChildItem -Path $base -Recurse -File | Where-Object { $_.Extension -eq "" } | ForEach-Object {
        $newName = $_.FullName + ".jpg"
        Write-Host "修改檔案: $($_.FullName) -> $newName"
        Rename-Item $_.FullName $newName
    }



     


     
     


     



    🔍 PowerShell 指令說明表


























    操作指令說明
    刪除縮圖Remove-Item -Force清除 _thumb__t 等縮圖檔案
    加副檔名Rename-Item為沒有副檔名的媒體檔加上 .jpg
    輸出紀錄Write-Output顯示修改後的檔案名稱與路徑




    🌳 總覽流程圖
     


     



    📱 舊手機 Xperia 5 III (Android 13)

    ├─ 使用 iTransor for LINE 備份 → ❌ 失敗(無法安裝舊版 LINE)

    └─ 改用手動方式:

            ├─ ADB 匯出 LINE 資料夾

            │

            └─ /sdcard/Android/data/jp.naver.line.android/

            ├─ PowerShell 處理:

            │     ├─ 刪除縮圖 (*thumb*, *_t*)

            │     └─ 補上 .jpg 副檔名

            └─ 成功復原照片

     → 📱 匯入新手機 Xperia 1 VI (Android 16)



    🧭「照片救回動畫圖」
    📲 Xperia 5 III (Android 13)
        ↓ iTransor 備份失敗!

    💻 改用 ADB 匯出 LINE 資料夾

        ↓

    🧹 PowerShell 處理:

          - 刪除縮圖

          - 補上 .jpg 副檔名

          ↓

    ✅ 所有照片成功救回!

          ↓

    📱 匯入 Xperia 1 VI (Android 16)



    🎯 最後心得






















    項目狀態
    Google Drive 備份✅ 聊天文字成功
    iTransor for LINE❌ 無法支援 Android 13 以上
    ADB + PowerShell 手動法✅ 完整救回所有媒體檔


     
    🧠 結語:備份這件事,最怕的是「以為」
    從決定換手機到入手 Xperia 1 VI,好不容易盼到夢寐以求的旗艦,心裡滿是期待,以為備份只是例行操作。結果整整花了兩天,卡在備份失敗、資料傳輸、還原錯誤訊息中打轉。
    iTransor 的確是許多人推薦的工具,但當 Android 不允許降版、LINE 綁定新版,軟體瞬間失效。唯一可行的方法,只有回到最原始的操作──自己動手
    當 PowerShell 一行行印出

    修改檔案:xxxx.jpg

    看到照片重現的瞬間,那種成就感,比任何自動備份都踏實、更有掌控感。
    教訓很清楚:

  • Google 備份沒錯,但只能備份文字 → 太淺




  • iTransor 太舊 → 跟不上新系統




  • 任何「一鍵還原」都值得懷疑




  • 命令列完全可控,永遠值得信任





  • 💻 補充:ADB 下載點
    使用 Android SDK Platform Tools(不走 MTP)可穩定傳輸大型檔案:
     


     



    adb devices adb pull /sdcard/DCIM/ D:\Backup\


  • 優點:傳輸穩定、不中斷、支援大型檔案




  • 缺點:需開啟 USB 偵錯,對一般使用者略複雜



  • 🔗 ADB 下載與官方說明

    sungshu 發表在 痞客邦 留言(0) 人氣()


    華碩製造的 nexus 2013
    核心版本 3.4.0-gad29d11
    代表: 裝置是 Nexus 7 (2013 LTE / deb)
    統版本是 Android 6.0.1 (Marshmallow, Build MOB30X)
    使用 Google/ASUS 官方 Kernel 編譯版本
    更新韌體最終目的 是要安裝 revanced manager 3.0.4
    關閉螢幕使用 youtube 

    sungshu 發表在 痞客邦 留言(0) 人氣()


    這段程式碼定義了一個名為 Decrypt-DataAndDisplay 的函式,主要用於自動化腳本的「驗證階段」,確保我們產生的金鑰檔能正確還原回明碼密碼。

    sungshu 發表在 痞客邦 留言(0) 人氣()


    這段程式碼主要包含兩個主要函式以及一個用於安全輸入的輔助函式。為了日後維護方便,以下詳細紀錄每一部分的功能與運作流程。

    sungshu 發表在 痞客邦 留言(0) 人氣()


    這段程式碼的主要功能是解密之前加密過的憑證私鑰密碼,並將解密後的結果顯示在控制台上。以下是程式碼各部分的功能說明:






    1. Decrypt-Password 函數:



      • 接受兩個參數:$KeyFilePath (存儲加密金鑰的文件路徑) 和 $EncryptedPasswordFilePath (存儲加密後密碼的文件路徑)。

      • 從指定的 $KeyFilePath 讀取加密金鑰。

      • $EncryptedPasswordFilePath 中讀取加密過的密碼。

      • 使用從檔案讀取的加密金鑰來對加密後的密碼進行解密,得到安全字串 (SecureString)。

      • 將安全字串轉換為普通字串 ($Password),以便於顯示或後續使用。




    2. 解密證書私鑰密碼:



      • 呼叫 Decrypt-Password 函數,並將加密金鑰文件路徑 ($KeyFilePath) 和加密後密碼文件路徑 ($EncryptedPasswordFilePath) 作為參數傳遞進去。

      • 函數會解密指定的加密密碼文件,並將解密後的私鑰密碼顯示在控制台上,同時以綠色文字標記操作成功的訊息。




    這段程式碼與前面的加密函數結合使用,允許您在需要時安全地加密和解密憑證私鑰密碼,以確保敏感資訊的安全性。






    sungshu 發表在 痞客邦 留言(0) 人氣()


    這段程式碼的主要功能是用來加密一個使用者輸入的憑證私鑰密碼,並將加密後的結果存儲到指定的文件中。以下是每個部分的功能說明:

    Encrypt-Password 函數:



    • 接受三個參數:$Password (要加密的私鑰密碼)、$KeyFilePath (存儲加密金鑰的文件路徑)、$EncryptedPasswordFilePath (存儲加密後密碼的文件路徑)。

    • 從指定的 $KeyFilePath 讀取加密金鑰。

    • $Password 轉換為安全字串 (SecureString)。

    • 使用從檔案讀取的加密金鑰來對安全字串進行 AES 加密 (ConvertFrom-SecureString)。

    • 將加密後的結果寫入到指定的 $EncryptedPasswordFilePath 文件中。


    生成隨機的加密密鑰:



    • 使用 Get-Random 生成一個隨機的 AES 加密金鑰。

    • 將這個隨機生成的金鑰以 Base64 格式保存到 $KeyFilePath 中。


    提示用戶輸入憑證私鑰密碼:



    • 使用 Read-Host 提示用戶輸入憑證私鑰密碼,輸入時會顯示為安全字串。

    • 將輸入的安全字串轉換為普通字串,以便後續加密過程使用。


    加密證書私鑰密碼並存儲到文件:



    • 呼叫 Encrypt-Password 函數,將用戶輸入的私鑰密碼、加密金鑰文件路徑和加密後密碼文件路徑作為參數傳遞進去。

    • 函數會將加密後的私鑰密碼存儲到指定的文件中,同時在控制台顯示操作成功的訊息。


    sungshu 發表在 痞客邦 留言(0) 人氣()


    這個 PowerShell 腳本的用途是自動化更新 IIS 網站的 SSL 憑證。主要功能包括:
    1.    下載和讀取 PFX 憑證密碼:
    o    從指定的 URL 下載 PFX 憑證的密碼。
    2.    下載 PFX 憑證檔案:
    o    從指定的 URL 下載 PFX 憑證檔案到本地。
    3.    匯入憑證並取得指紋:
    o    將 PFX 憑證匯入到本地機器的證書存儲區,並取得匯入憑證的指紋。
    4.    獲取所有 IIS 網站名稱和目前 SSL 綁定資訊:
    o    獲取所有 IIS 網站名稱,並顯示每個網站當前的 SSL 綁定資訊和憑證指紋。
    5.    更新 SSL 綁定:
    o    使用新憑證的指紋更新所有使用舊憑證的 SSL 綁定。
    6.    檢查 SSL 綁定是否已切換到新憑證:
    o    驗證所有網站的 SSL 綁定是否已更新到新的憑證指紋。
    7.    刪除本地的 PFX 檔案:
    o    刪除下載的臨時 PFX 檔案。
    8.    刪除舊憑證:
    o    刪除與新憑證不同的舊憑證,以確保只保留最新的憑證。
    9.    重新啟動 IIS 服務:
    o    重新啟動 IIS 服務以應用新的憑證設定。
    10.    刪除腳本本身:
    o    在操作完成後刪除腳本本身。
    這個腳本實現了自動化的 SSL 憑證更新流程,適用於需要定期更新憑證的 IIS 伺服器環境。

    sungshu 發表在 痞客邦 留言(0) 人氣()


    這個 PowerShell 腳本的主要用途是自動化更新 IIS 網站的 SSL 憑證,以下是腳本的詳細步驟及功能說明:
    1.    變數設置:
    o    $PFX_FILE_URL: 存儲 PFX 憑證文件的 URL。
    o    $PASSWORD_URL: 存儲 PFX 憑證密碼的 URL。
    o    $TEMP_PFX_PATH: 暫存 PFX 憑證文件的本地路徑。
    o    $SSL_BINDING_IPPORT: 指定的 IP 和端口號。
    o    $SSL_APP_ID: 用於 SSL 綁定的應用程序 ID。
    2.    下載 PFX 密碼:
    o    從指定的 URL 下載 PFX 密碼,並檢查 HTTP 狀態碼以確保下載成功。
    3.    獲取所有 IIS 網站名稱:
    o    使用 Get-Website 命令獲取所有 IIS 網站的名稱。
    4.    顯示當前 SSL 綁定的憑證信息並獲取指紋:
    o    對於每個網站,顯示其 SSL 綁定的相關信息,包括協議、憑證指紋、憑證主題和綁定信息。
    5.    下載 PFX 檔案:
    o    從指定的 URL 下載 PFX 檔案到本地,並檢查檔案是否成功下載。
    6.    匯入憑證並取得指紋:
    o    將 PFX 憑證匯入到本地機器的證書存儲區,並取得匯入憑證的指紋。
    7.    更新 SSL 綁定:
    o    使用 netsh 命令更新 SSL 綁定,將新的憑證指紋應用到指定的 IP 和端口。
    8.    再次檢查 SSL 綁定是否已切換到新憑證:
    o    檢查每個網站的 SSL 綁定是否已更新到新的憑證。
    9.    刪除本地的 PFX 檔案:
    o    刪除下載的臨時 PFX 檔案。
    10.    刪除舊憑證:
    o    刪除與新憑證不同的舊憑證,以確保只保留最新的憑證。
    11.    重新啟動 IIS 服務:
    o    重新啟動 IIS 服務以應用新的憑證設定。
    12.    查詢並刪除目前腳本檔案:
    o    查詢腳本檔案的完整路徑,並在操作完成後刪除該腳本檔案。
    此腳本實現了一鍵式的自動化 SSL 憑證更新流程,適用於需要定期更新憑證的 IIS 伺服器。

    sungshu 發表在 痞客邦 留言(0) 人氣()


    想了半天覺得還是登入系統用powershell來一鍵完成
    比較實際

    sungshu 發表在 痞客邦 留言(0) 人氣()


    sungshu 發表在 痞客邦 留言(1) 人氣()

    2021-07-28_091507.png
    以下稱Skype for Business 簡稱為 SFB
    就~~~看圖說故事吧!!@@!

    sungshu 發表在 痞客邦 留言(0) 人氣()

    Blog Stats
    ⚠️

    成人內容提醒

    本部落格內容僅限年滿十八歲者瀏覽。
    若您未滿十八歲,請立即離開。

    已滿十八歲者,亦請勿將內容提供給未成年人士。