# 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)