【GitHub】sshでID/Passwordの入力を省略するための一番簡単な手順

なるべく脳死でコマンドコピペのみで行けるようにしてます。
GitHub上で初めてSSH接続したい方向け。
解説も書いてますが、急いでる方は飛ばしてもOK。
開発環境はMacを想定。

## 手順
1. 新しいSSHキーを生成
2. SSH キーを ssh-agent に追加
3. GitHub で自分のアカウントに SSH 公開キーを追加
4. 登録したいGitHubのリポジトリのリモートURLを変更
5. `git pull`できるか確認

## 1. 新しいSSHキーを生成
```bash
$ ssh-keygen -t ed25519 -C "your_email@example.com" -f "filename"

# 鍵の保存場所を聞かれるが、EnterでOK(\/home/yourname/.ssh/`に保存される)
$ Enter file in which to save the key (/home/user/.ssh/id_ed25519):

# 以下の通りパスワード入力求められるので入力
> Enter passphrase (empty for no passphrase): [Type a passphrase]
# 確認用でもう一度入力
> Enter same passphrase again: [Type passphrase again]
```

### コマンドの解説（読み飛ばし可）
#### ssh-keygen
SSH 鍵ペア（公開鍵と秘密鍵）を作成するコマンド。

####  -t ed25519
生成する鍵の種類（キータイプ）を指定するオプション。
Ed25519 は楕円曲線暗号 (Elliptic Curve Cryptography, ECC) の一種で、従来の RSA や DSA よりも セキュリティが高く、鍵のサイズが小さい という特徴がある。
Ed25519 のメリット
- 既存の 3072-bit RSA 鍵と同等以上のセキュリティを持つ
- 署名の速度が速く、鍵のサイズが小さい（管理しやすい）
- 既知の攻撃に対して強い耐性を持つ
- OpenSSH 6.5 以降でサポートされている

####  -C "your_email@example.com"
鍵のコメントを設定するオプション。
通常、GitHub や GitLab で SSH 鍵を管理する際の識別子としてメールアドレスを指定することが多い。
-C を使うことで、複数の鍵を扱うときにどの鍵がどの用途かを分かりやすくするためにコメントを追加できる。
SSH 鍵の中にコメントが含まれるので、後で ~/.ssh/id_ed25519.pub を見ると、末尾に "your_email@example.com" が付いているのが確認できる。

#### -f "filename"
鍵にファイル名を付けたい場合に指定。
自分の場合は、githubとgitlabを併用しているので、`-f 'gitlab_rsa'`のような使い方をしている。

## 2. SSH キーを ssh-agent に追加する
### バックグラウンドでssh-agentを開始

```bash
$ eval "$(ssh-agent -s)"
> Agent pid 59566 # ←pidの番号は人によって変わる(当然)
```


### `~/.ssh/config`ファイルを修正

```bash
$ open ~/.ssh/config
> The file /Users/YOU/.ssh/config does not exist.

# 以下のコマンドでファイルを作成
$ touch ~/.ssh/config

# 以下をファイル内に追加
Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519
```


※ `open ~/.ssh/config` でファイルが開かれた場合、ファイルが存在しているということ。よって、以下の記述をファイルの一番下に追記。
→githubの設定がある場合は記述を削除して以下を貼り付けるか、マニュアル参照して対処。

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


### SSH秘密鍵をssh-agentに追加して、パスフレーズをキーチェーンに保存
MacOSを想定しているため、`--apple-use-keychain`を使用してキーチェーンにパスフレーズを保存
```bash
$ ssh-add --apple-use-keychain ~/.ssh/id_ed25519
```


### GitHubアカウントへの新しい SSH キーの追加
以下のコマンドで公開鍵をコピー

```bash
$ cat ~/.ssh/id_ed25519.pub
> ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxx...
# 上記の`ssh-ed25519...`の部分を全てコピー
```

### コマンドの解説（読み飛ばし可）

#### `eval "$(ssh-agent -s)"`
1. `ssh-agent -s`
SSHエージェントを起動→環境変数の設定するためのシェルスクリプトを出力

```bash
$ ssh-agent -s
> SSH_AUTH_SOCK=/tmp/ssh-RANDOM/agent.12345; export SSH_AUTH_SOCK;
> SSH_AGENT_PID=12345; export SSH_AGENT_PID;
> echo Agent pid 12345;
```


素直に環境変数を設定するなら、ターミナルで `SSH_AUTH_SOCK=/tmp/ssh-RANDOM/agent.12345;` をコピペ実行→`export SSH_AUTH_SOCK;` をコピペ実行...
やってられないので、ここで`eval`が出てくる

2. `eval`
`ssh-agent -s` の結果をシェルスクリプトとして実行する。
`;`で実行コマンドを区切るため、順番に環境変数を設定できる。
`$()`とすることでコマンド置換され、`()`内のコマンドの出力を取得
```bash
$ eval "SSH_AUTH_SOCK=/tmp/ssh-RANDOM/agent.12345; export SSH_AUTH_SOCK;
        SSH_AGENT_PID=12345; export SSH_AGENT_PID;
        echo Agent pid 12345;"
```


#### `~/.ssh/config` の存在理由
SSHの接続設定をカスタマイズするための設定ファイル（そのまま）

Linuxにおける`~/.ssh/config`はSSHは、設定を以下の順で読み込む
1. `/etc/ssh/ssh_config`:システム全体の設定
2. `~/.ssh/ssh_config`:ユーザーごとのシステム設定

#### `ssh-add --apple-use-keychain ~/.ssh/id_ed25519`
1. `ssh-add`
	- バックグラウンドで動作し、SSH認証を管理
	- `ssh-add`を使って秘密鍵を`ssh-agent`に追加すると、パスフレーズの入力のかわりに`ssh-agent`が認証を処理する
	- `ssh-agent`稼働中は、SSH鍵のパスフレーズが不要
2. `--apple-use-keychain`オプション
	- `ssh-agent`はターミナルを閉じるとパスフレーズを忘れる
	- macOSのキーチェーンにパスフレーズが保存されるため、次回以降`ssh-add`が不要。
	- キーチェーンはmacOSに標準搭載されるパスワード管理システム
	- `~/.ssh/config`ファイルの中に`UseKeychain yes`の記述で、ssh-agentはキーチェーンを参照する

#### そもそも`ssh-*`コマンドはなぜ使えるのか
OpenSSH (OpenBSD Secure Shell)によって機能が提供されている。
`ssh-agent` や `ssh-add` は、SSH (Secure Shell) プロトコルのための補助ツール。
他にも`ssh`,`sshd`,`ssh-keygen`もあり、これらはMac/Linuxに標準搭載されている。
https://www.openssh.com/


## 3. GitHubのSSH keys画面で設定
https://github.com/settings/keys

1. 「New SSH key」クリック
2. 「Title」＞任意の名前で設定
3. Key type＞「Authentication Key」
4. コマンドラインでコピーした公開鍵を貼り付け
5. 「Add SSH key」クリック

「Title」に設定した鍵名が表示されたらOK

### 接続確認
以下のメッセージが表示されたらSSHに成功
```bash
$ ssh -T git@github.com
> Hi あなたのユーザー名! You've successfully authenticated, but GitHub does not provide shell access.
```

逆に、以下のメッセージは失敗、何かがうまくいっていない
```bash
$ ssh -T git@github.com
git@github.com: Permission denied (publickey).
```

## 4. 登録したいGitHubのリポジトリのリモートURLを変更
Git のリポジトリが HTTPSの場合、SSH 認証が適用されない。
現在の設定を確認し、必要があれば変更する

以下の場合、HTTPSでの接続
```bash
$ git remote -v
> origin https://github.com/your-username/your-repository.git (fetch)
> origin https://github.com/your-username/your-repository.git (push)
```

SSHに変更する
```bash
$ git remote set-url origin git@github.com:your-username/your-repository.git

# 確認
$ git remote -v

# 以下ならOK
> origin git@github.com:your-username/your-repository.git (fetch)
> origin git@github.com:your-username/your-repository.git (push)
```

- 公開鍵 (~/.ssh/id_ed25519.pub) が GitHub に正しく登録されているか確認。
- ssh-agent に鍵が追加されているか確認 (ssh-add -l)。
- ~/.ssh/config の IdentityFile が適切か確認。

## 5. `git pull`できるか確認
ID/Passを求められずに操作が完了できればOK
```bash
$ git pull origin main
```

参考
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/about-ssh
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account