---
# System prepended metadata

title: 使用 SSH key 連接到 remote git repositories
tags: [CLI, git]

---

# 使用 SSH key 連接到 remote git repositories

[TOC]

<STYLE>
	.keyboardButton {
		border: 1px solid #000;
		border-radius: 6px;
		cursor: default;
		font-family: 'Bitstream Vera Sans Mono',monospace;
		padding: 6px;
	}
</STYLE>

---

## 產生密鑰

1. 將下例中**電子郵件地址**替換為 [Bitbucket](https://bitbucket.org/)、[GitCode](https://gitcode.com/)、[GitHub](https://github.com/)、[GitLab](https://gitlab.com/)、[Gitee](https://gitee.com/) 帳號或其它電子郵件地址，執行下面的指令。

```shell
ssh-keygen \
-t ed25519 \
-C 'someone@somewhere.net'
```

應會輸出類似下面的結果：

```
Generating public/private ed25519 key pair.
```

:::info
新的 SSH 密鑰已被建立，上面指令中提供的**電子郵件地址**被作為此密鑰的 label<SUP>(標籤)</SUP>。
:::

2. 這時 `ssh-keygen` 會詢問要保存**密鑰檔案**的**位置**。

```
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/someone/.ssh/id_ed25519): 
```

輸入**絕對路徑**。

3. 輸入 passphrase<SUP>(密語)</SUP>兩次，或按兩次 <SPAN class="keyboardButton">Enter &#x21A9;</SPAN> 鍵跳過這個步驟。

```
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

應會輸出類似下面的結果：

```
Your identification has been saved in /Users/someone/.ssh/id_ed25519
Your public key has been saved in /Users/someone/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:UZVRLrwUEBrW8JAaf49WXSSA4PFrM51wqeMsxY5pBbQ someone@somewhere.net
The key's randomart image is:
+--[ED25519 256]--+
|        O=+===o..|
|      .+.Xo..+ ..|
|       +E + *... |
|      . .+.B.+.  |
|        S.@++    |
|         Xo+.    |
|        =.+      |
|       . .       |
|                 |
+----[SHA256]-----+
```

:::info
示例中的

- `/Users/someone/.ssh/id_ed25519` 為**私鑰**的保存路徑。
- `/Users/someone/.ssh/id_ed25519.pub` 為**公鑰**的保存路徑。
:::

:::success
單一行指令搞定以上所有步驟：
```shell
ssh-keygen \
-C 'someone@somewhere.net' \
-f /Users/someone/.ssh/id_ed25519 \
-N '' \
-t ed25519
```
:::

## 將 SSH 密鑰添加到 `ssh-agent`

:::warning
0. [PowerShell](https://learn.microsoft.com/powershell/scripting/overview) 用戶可能須先執行：

```shell
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
Start-Service ssh-agent
```

貌似兩行(⁉️)指令(吧)；請 [Windows&#8482;](https://www.microsoft.com/windows/) 用戶自行想辦法。
:::

1. 在背景啟動 `ssh-agent`：

```shell
eval "$(ssh-agent -s)"
```

應會輸出類似下面的結果：

```
Agent pid 5678
```

### 將 passphrase<SUP>(密語)</SUP>存儲在 keychain 中

:::warning
不適用 [Windows&#8482;](https://www.microsoft.com/windows/) 用戶❗️
:::

```shell
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
```

:::info
僅 macOS 用戶須添加 `--apple-use-keychain` 引數，Linux 用戶請忽略此 argument。
:::

### (Optional) 在本機維護多個密鑰

編輯 `~/.ssh/config`，為(每)一組密鑰建立如下內容：

```
Host github.com
	AddKeysToAgent yes
	HostName github.com
	IdentityFile ~/.ssh/id_ed25519
	UseKeychain yes
	User git
```

## 將 SSH 公鑰複製、貼上到 git repository

```shell
pbcopy < ~/.ssh/id_ed25519.pub
```

![将 SSH 公钥从剪贴板粘贴到 git repository](https://hackmd.io/_uploads/r1W5JV_2C.png)
