2015年9月27日 星期日

何謂ssh?在Windows下如何使用ssh?如何在Windows透過ssh下載和上傳程式到github?

對於一個完全沒有使用過Linux系統的人,要了解如何使用ssh其實是有一些門檻。不過隨著一些工具的出現,Windows使用者會使用到一些Linux的工具。最明顯莫過於git的版控系統。

git非常的好用,不過由於它是由Linux創始人所設計開發出來,因此裡面有一些工具是Linux天天在使用。而ssh就是其中一個工具。

這篇文章將會用我自己所理解的方式來說明ssh,和如何使用ssh來和github溝通。

什麼是ssh

由於我沒有用過Linux,因此這篇有些說明可能有些地方不夠精準,如果有誤,請大家幫忙指正。

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?

主要有兩個原因:

  1. 有些情況用不了https - 例如開了two step verification(兩步驗證)在bitbucket就用不了https(不過github開了兩步驗證還是可以用產生application的密碼來連https)
  2. 用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

通常來說:

  1. public key - 檔名 預設是id_rsa.pub
  2. private key - 檔名 預設是id_rsa

如果上面看不太懂,講白一點就是,ssh key類似一個憑證需要在雙方電腦設定好才能夠溝通。然後passphrase就是密碼。

在Windows使用ssh需要什麼?

在Windows有2種類型的程式可以支援ssh:

  1. command line工具 - 通常是指 OpenSSH
  2. GUI工具 - PuTTY

在安裝完了git,會自動帶OpenSSH。因此這這篇介紹的工具就是用OpenSSH。

關鍵exe和參數介紹

下面先介紹之後會用到的一些參數和exe檔案說明。

程式/參數 說明
OpenSSH程式位置

{Git安裝路徑}\usr\bin

%programfiles%\Git\usr\bin

以我的電腦的地方是在:C:\Program Files\Git\usr\bin

下面的程式都是在OpenSSH的程式位置資料夾裡面

ssh key預設位置

Linux是:~/.ssh

Windows在:%userprofile%\.ssh

這邊要注意有些設定要用Linux的語法 - 因為有些工具還是使用linux的位置。

ssh key預設檔案名稱
  1. public key - 檔名 預設是id_rsa.pub
  2. private key - 檔名 預設是id_rsa
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。

下面的cmd操作我都是使用PowerShell。因為PowerShell裡面有一個posh-git讓用PowerShell操作git變得很方便。

第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就好。

image
用ssh-keygen產生ssh key

做完了之後,在%userprofile%/.ssh應該就會看到兩個檔案:

  1. id_rsa
  2. id_rsa.pub
image
確認產生的key

第2步 - 把public key加入到github

用一個檔案編輯器打開id_rsa.pub,然後把所有內容複製下來。

image
複製public key

這時候在到github,然後在Settings裡面找到SSH Keys,然後選Add SSH key。在key的部分貼上剛剛從public key複製的內容。至於title主要是給自己看的名稱。

image
在Github設定ssh key

第3步 - 測試設定是否成功

要注意,在做這個之前先把剛剛的PowerShell關掉,然後在開起來。這樣才會抓到心得key。

上面都設定完成了之後,可以用下面指令來測試:

ssh -T git@github.com

因為從來沒有連過會需要確認是否允許連線,這個時候輸入yes就可以。

看到下面畫面就成功了。

image
測試github ssh key
如果出現:Permission denied (publickey).表示沒有設定成功。

第4步 - 設定ssh passphrase,避免每一次都需要重新輸入

做到上面為止,其實連線都沒問題了,但是每一次都要輸入passphrase其實很煩,因此我們可以透過ssh-agent這個服務,能夠記錄住ssh key 的 passphrase。

可以透過ssh-add -l來先確認是否有任何key有記錄passphrase。

image
測試目前設定的ssh-agent

可以透過ssh-add {key path}來加入key 的passphrase,因此:

ssh-add id_rsa

這個時候在用ssh-add -l,會看到多了一筆。

image
確認是否加入成功
如果你在Windows的git用的是Posh-git,那麼不用做任何事情ssh-agent會自動被啟動。不過如果不是,會需要做一些設定。可以參考:Set up SSH for Git 其中 Step 4. Update your .bashrc profile file

第5步 - 取得Github專案的ssh連線

到任何一個repo,然後在右邊copy ssh的連線,之後就用那個連線做clone就可以。然後push的時候自動就會上去。

image
github repo ssh 連線

結語

希望透過這一篇,能夠對於在Windows使用ssh變的更加容易,並且要用在git的public repository例如github和bitbucket都會非常的方便和容易。

不過需要注意一件事情,假設今天你使用的不是用PowerShell的Posh-git方式操作git,那麼可能需要再做一些其他設定。

在下一篇我會在介紹,當有2個以上的ssh key的時候要怎麼設定。可以想象,當你github和bitbucket用2個不同ssh key的時候,要如何處理。

其他資料

blogspot 的標籤: git,ssh

1 則留言 :