Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

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

2015-09-27 Sunday

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

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

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

更新記錄

  1. 2018/11/22 - [faq]Windows 1803之後git for windows無法透過Start-SshAgent啓用ssh agent - 需要一直輸入passphrase的問題 - Windows 1803如果呼叫有問題的話可以參考

什麼是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

如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
2015-09-27 Sunday
comments powered by Disqus