# 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)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.