---
# System prepended metadata

title: SSH 是什麼神秘的資料傳輸方式？
tags: [FTP, SSH]

---

# SSH 是什麼神秘的資料傳輸方式？
Secure Shell Protocol，安全殼層通訊協定。

SSH 的誕生源於一場事故。芬蘭開發者 Tatu Ylönen 發現自己學校存在嗅探密碼的網路攻擊，便於 1995 年編寫了一套保護資訊傳輸的程式。

後來為了修補 1.0 的安全缺陷，網際網路工程任務組（Internet Engineering Task Force，縮寫：IETF） 在 2006 年共同訂定了我們現在看到的 [SSH 2.0 (RFC 4251)](https://www.ietf.org/rfc/rfc4251.txt) 規範。

根據規範寫的 SSH 定義：
>The Secure Shell (SSH) Protocol is a protocol for **secure remote login** and other **secure network** services over an **insecure network**.
> 
>*SSH (Secure Shell) 協定是一種在**不安全網路**上，提供**安全遠端登入**及其他**安全網路服務**的通訊協定。*

## 為什麼說網路是「不安全」的？

在網路的世界裡，你的資料從電腦出發到抵達伺服器，中間會經過無數個節點（例如：路由器、交換機、電信商機房）。

如果你使用的是傳統的連線方式，這些資料就像寫在 **「明信片」** 上，任何一個中間節點只要使用抓包工具（例如： Wireshark），就能輕易看光你的資料（包含帳密！）。

## SSH 怎麼防範危險？
- **加密連線（Encryption）**：SSH 透過非對稱與對稱加密技術，確保資料在傳輸過程中即便被中間節點攔截，也無法被解讀其內容，保障了資料的機密性。
- **通道能力（Tunneling）**：SSH 支援連接埠轉發（Port Forwarding），能在不安全的網路環境中建立一條安全的通訊路徑。唯有通過金鑰驗證（Authentication）的合法用戶，才能取得存取權限並執行遠端指令。

較舊的網路傳輸就是人和人都可以看到的形式來傳輸管理員命令，例如：Telnet。

如果你在星巴克或其他公共 Wi-Fi 連上 PTT `telnet://ptt.cc`（~~天啊知道這個網址好老~~），中間的任何一台路由器（Hops）都能透過簡單的抓包工具看光你的登入資訊。

這就是為什麼現在 PTT 也開始推廣 `ssh bbs@ptt.cc`。

雖然對一般使用者來說畫面看起來一樣，但底層卻是從「裸奔的明信片」進化成了「防彈的地道傳輸」。

## SSH 現在的使用狀況

雖然在前端開發時可能很少直接下 SSH 指令，但它其實無所不在：

1. **雲端管理**：不管是 AWS、GCP 還是 Azure，所有的工程師都是透過 SSH 進入雲端主機進行維護。 
2. **版本控制（Git）**：雖然可以用 HTTPS 方式 `git push`，但工程師更偏愛 SSH。因為設定好金鑰後，你不需要每次都輸入帳號密碼，且安全性更高。
3. **自動化部署（CI/CD）**：機器人自動幫你更新程式碼時，手裡拿的就是 SSH 鑰匙。

> **為什麼 GitHub 總叫我設定「公共 SSH 金鑰」？** 
> 
> 這是為了**免密碼登入**。 根據 **RFC 4251** 的認證機制，這叫「非對稱加密」。
> 
> 你手上的 **私鑰（Private Key）** 是保險箱鑰匙，放在 GitHub 的 **公鑰 (Public Key)** 是保險箱本身。 每次連線時，GitHub 會出一個題目給你的私鑰解，解開了就代表「你是本人」，這比記密碼安全、方便！

## 怎麼使用 SSH 上傳檔案？

在執行上傳前，我們通常會先做登入測試：
**登入遠端伺服器**：`ssh <username>@<remote_host_ip>`，例如：`ssh user_charlie@192.168.1.111
`
- 第一次連線時，系統會詢問是否信任該主機的指紋（Fingerprint），請輸入 `yes`。
    
- 系統會將指紋加入 `~/.ssh/known_hosts`。這一步是為了確保你連上的真的是目標機器，而不是被「路人」冒充。

- 接下來會需要輸入密碼，終端機不會顯示任何字符，這是正常的安全機制。

確認連線後，我們在**本地端終端機**（非遠端環境）使用 `scp` 指令上傳：

- **上傳 dist 資料夾** (注意 `-r` 是遞迴傳送整個資料夾)： `scp -r dist <username>@<remote_host_ip>:/home/<username>/<target_folder>`
    
- **上傳特定檔案** (如設定檔或環境變數)： `scp package.json .env <username>@<remote_host_ip>:/home/<username>/<target_folder>`

>**SCP 又是什麼？**
>**SCP** 全名是 **Secure Copy Protocol**（安全複製協定）。
>- **本質**：它是建立在 **SSH** 協定之上的檔案傳輸工具。
>- **功能**：讓你透過指令，在本地電腦與遠端伺服器之間，安全地複製檔案或資料夾。

## SSH 跟 FTP 有什麼不同？

**FTP（File Transfer Protocol）** 是專門用來「搬運檔案」的老方法，它在路上傳輸的時候，任何人都能看見裡面裝了什麼，甚至包含你的帳號密碼（!）。

**SSH** 則是一條**加密地道**，能保護資料不被偷看，還能下指令。現在我們常用 **SFTP**，其實就是讓這台貨車跑在 SSH 的安全地道裡。簡單來說，FTP 只能單純搬家，而 SSH 是先蓋出絕對安全的通道，再決定要在裡面搬家還是指揮操作。

> **FTP 的歷史（1971年問世）**
> 
>FTP（File Transfer Protocol） 誕生於網際網路早期、沒有駭客的年代。初衷很單純－－讓科學家們能互傳檔案。
>- **致命傷**：所有的資料（包含你的密碼）都是「明碼（Plaintext）」傳輸。
>- **現況**：傳統的 FTP 現在幾乎已經被淘汰，或者演進成跑在 SSH 隧道裡的 **SFTP**。除非是維護極老舊的系統，否則現代開發者絕對不會在不加密的情況下使用它。

## SSH 跟遠端進入桌面手動傳檔案有什麼不同？

**遠端桌面（GUI）** 就是用滑鼠操作遠方螢幕，非常直觀但極度消耗頻寬，因為它得傳送整張畫面的訊號。

**SSH（CLI）** 則是透過純文字指令操作，就像是用「對講機」遠端遙控。它非常輕量、快速，且具備**自動化**的潛力。如果你有 100 台伺服器，你不可能逐一開視窗「手動搬運」，但你可以寫一行指令讓 SSH 同時在 100 台機器上工作。這就是專業開發者追求的「效率」與「可程式化」。

## SSH 跟 CI/CD 又有什麼關係？

**SSH 是「工具」，CI/CD（Continuous integration / Continuous Deployment，持續整合／持續布署） 是「流程」**。當你每次都需要手動輸入 `ssh` 登入伺服器更新檔案，容易出錯且耗時。

**CI/CD** 則像是一條**全自動化工廠流水線**。當你把程式碼 Push 出去，機器人（例如：GitHub Actions）會自動啟動，它會「手持 SSH 鑰匙」進入伺服器，幫你把剛寫好的 Code 換上去並重啟服務。有了 CI/CD，你不再需要親自下 SSH 指令，程式會依照定義好的指令檢查與更新。

### 參考資料：
[維基百科 | Secure Shell](https://zh.wikipedia.org/wiki/Secure_Shell)