對於一個完全沒有使用過Linux系統的人,要了解如何使用ssh其實是有一些門檻。不過隨著一些工具的出現,Windows使用者會使用到一些Linux的工具。最明顯莫過於git的版控系統。
git非常的好用,不過由於它是由Linux創始人所設計開發出來,因此裡面有一些工具是Linux天天在使用。而ssh就是其中一個工具。
這篇文章將會用我自己所理解的方式來說明ssh,和如何使用ssh來和github溝通。
更新記錄
- 2018/11/22 - [faq]Windows 1803之後git for windows無法透過Start-SshAgent啓用ssh agent - 需要一直輸入passphrase的問題 - Windows 1803如果呼叫有問題的話可以參考
什麼是ssh
ssh是Secure SHell protocl
的縮寫,基本上可以把它想成是有加密過的telnet
。不過如果你和我一樣只是聽過telnet這個名詞,那其實還是不了解ssh是什麼。
以我自己的理解是,ssh和telnet其實就是用shell 的方式連到遠端電腦。在Windows世界裡面,連到另外一台電腦都是透過Remote Desktop Connection(遠端連線工具),而Remote Desktop Connection是有GUI的界面,而ssh和telnet則是透過shell(command line)的方式連到電腦。
為什麼在Windows 要用 ssh
因為在Windows下面有時候會需要連線到Linux的服務。以我來說,使用git版控的時候,當想要把source code push到online repository(例如github或者bitbucket)的時候,都是建議使用ssh做連線。
或許你會說,可是online repository都有接受用https的方式做連線,為什麼要用ssh?
主要有兩個原因:
- 有些情況用不了https - 例如開了two step verification(兩步驗證)在bitbucket就用不了https(不過github開了兩步驗證還是可以用產生application的密碼來連https)
- 用https每一次都需要打密碼 - ssh可以不用
為什麼ssh比telnet還安全?何謂ssh key?
telnet和ssh是同類型的東西。差別在於,ssh的連線通道是經過加密。ssh使用所謂的public 和 private key的Architecture來做連線通道的加解密。
簡單來說,public 和 private key是2個不同的檔案。如果資訊透過一個key來加密,那麼另外一個key就可以用於解密。而通常public key是給外部系統用,而private key則是自己用,因此才能夠雙方溝通。
為了進一步保護key,設定key的時候通常會在設定一組密碼稱之為passphrase。
通常來說:
- public key - 檔名 預設是
id_rsa.pub
- private key - 檔名 預設是
id_rsa
如果上面看不太懂,講白一點就是,ssh key類似一個憑證需要在雙方電腦設定好才能夠溝通。然後passphrase就是密碼。
在Windows使用ssh需要什麼?
在Windows有2種類型的程式可以支援ssh:
- command line工具 - 通常是指 OpenSSH
- GUI工具 - PuTTY
在安裝完了git,會自動帶OpenSSH。因此這這篇介紹的工具就是用OpenSSH。
關鍵exe和參數介紹
下面先介紹之後會用到的一些參數和exe檔案說明。
程式/參數 | 說明 |
---|---|
OpenSSH程式位置 |
以我的電腦的地方是在: 下面的程式都是在OpenSSH的程式位置資料夾裡面 |
ssh key預設位置 | Linux是: Windows在: 這邊要注意有些設定要用Linux的語法 - 因為有些工具還是使用linux的位置。 |
ssh key預設檔案名稱 |
|
ssh.exe | ssh的主要程式,用作於連ssh。 |
ssh-kegen.exe | 用來產生ssh需要的key。 |
ssh-agent.exe | 一個程式用來記錄每一個ssh key的passphrase的工具。讓連ssh的時候不需要一直輸入passphrase。 |
ssh-add.exe | 管理ssh-agent.exe記錄的passphrase |
一步一步設定用作於Github的ssh key
這邊我會介紹如何從無到有設定github,然後用ssh方式連到repo。
第0步 - 設定OpenSSH的資料夾路徑到path裡面
因為之後操作都是用PowerShell,因此如果把OpenSSH的資料夾放到path裡面方便操作,因此開啟PowerShell之後,直接執行下面指令即可
[Environment]::SetEnvironmentVariable("Path", "$env:Path;$env:programfiles\Git\usr\bin", "User")
第1步 - 建立ssh key
首先第一步是先建立.ssh的資料夾:
New-Item -ItemType Directory "$env:USERPROFILE/.ssh" -Force
再來是移動到剛剛建立的.ssh資料夾:
cd $env:USERPROFILE/.ssh
透過ssh-keygen
產生出ssh key。其中-f
的參數是key的名稱,然後-C
則是這個key的id(其實我不太確定是什麼,不過大部分都是說輸入email)
ssh-keygen -f id_rsa -C "alan@alantsai.net"
這個時候會請你輸入passphrase,建議要輸入,這個會在每次做ssh的時候要求輸入。如果不想設passphrase,直接按下enter就好。
做完了之後,在%userprofile%/.ssh
應該就會看到兩個檔案:
- id_rsa
- id_rsa.pub
第2步 - 把public key加入到github
用一個檔案編輯器打開id_rsa.pub
,然後把所有內容複製下來。
這時候在到github,然後在Settings裡面找到SSH Keys,然後選Add SSH key。在key
的部分貼上剛剛從public key複製的內容。至於title
主要是給自己看的名稱。
第3步 - 測試設定是否成功
上面都設定完成了之後,可以用下面指令來測試:
ssh -T git@github.com
因為從來沒有連過會需要確認是否允許連線,這個時候輸入yes就可以。
看到下面畫面就成功了。
Permission denied (publickey).
表示沒有設定成功。 第4步 - 設定ssh passphrase,避免每一次都需要重新輸入
做到上面為止,其實連線都沒問題了,但是每一次都要輸入passphrase其實很煩,因此我們可以透過ssh-agent
這個服務,能夠記錄住ssh key 的 passphrase。
可以透過ssh-add -l
來先確認是否有任何key有記錄passphrase。
可以透過ssh-add {key path}
來加入key 的passphrase,因此:
ssh-add id_rsa
這個時候在用ssh-add -l
,會看到多了一筆。
Posh-git
,那麼不用做任何事情ssh-agent會自動被啟動。不過如果不是,會需要做一些設定。可以參考:Set up SSH for Git 其中 Step 4. Update your .bashrc profile file
。第5步 - 取得Github專案的ssh連線
到任何一個repo,然後在右邊copy ssh的連線,之後就用那個連線做clone
就可以。然後push
的時候自動就會上去。
結語
希望透過這一篇,能夠對於在Windows使用ssh變的更加容易,並且要用在git的public repository例如github和bitbucket都會非常的方便和容易。
不過需要注意一件事情,假設今天你使用的不是用PowerShell的Posh-git方式操作git,那麼可能需要再做一些其他設定。
在下一篇我會在介紹,當有2個以上的ssh key的時候要怎麼設定。可以想象,當你github和bitbucket用2個不同ssh key的時候,要如何處理。
其他資料
- 如果沒有用過指令方式操作git,建議可以試試。可以看看我之前做的簡報 工程師必備第一工具 - Git from Alan Tsai
- Configure Git in PowerShell So You Don’t Have to Enter Your Password All the Damn Time - 介紹Posh-Git帶來自動啟動ssh-agent的說明。
- Guide To Setting Up SSH on Windows 7 - SSH相關exe的使用
- Generating SSH keys - Github介紹產生ssh key
- Set up SSH for Git - Atlassain (Bitbucket公司)介紹產生ssh key
- Troubleshoot SSH Issues - Atlassain (Bitbucket公司)介紹如何測試ssh問題
- 第十一章、遠端連線伺服器SSH / XDMCP / VNC / RDP - 鳥哥介紹SSH