ホスト名指定するだけでSSH接続がしたい！

# 目標
```shell
$ ssh <HostName>
```
だけでSSH接続がしたい！　という記事だよ。

# この記事の対象者（自己紹介）
* Linuxコマンドはある程度わかる。
* SSHって、あの、あれでしょ？　なんか別マシンにログインするtelnetの安全なヤツ的な...
* 突然SSHでログインしろって言われました。しかもユーザ名とかパスワードとか入力せずに、ホスト名指定だけでログインできるようにしろって...
* ググったけど、接続元と接続先ってどっちがどっちだかわからなくなってきた...このコマンドどっちのマシンで打てばいいんだかもわからない...
* 秘密鍵と公開鍵って、どっちのマシンにどっちを置けばいいんだこれ...

# 登場人物
<dl>
  <dt>AlphaServer</span></dt>
  <dd>接続元（クライアント）のマシン。<br>初めにログインしている方。<br>SSHコマンドを打つ方。</dd>
  <dt>Alice</dt>
  <dd>Alphaのユーザ。<br>初めにこのユーザにログインしてる。</dd>
  <dt>BravoServer</dt>
  <dd>接続先（ホスト）のマシン。<br>SSHでログインされる方。</dd>
  <dt>Bob</dt>
  <dd>Bravoのユーザ。<br>SSHでこのユーザにログインする。</dd>
</dl>
* **AlphaServer**/ **BravoServer**はいずれもLinux。SSHはインストール済み。

# 結論

1. 鍵ペアファイルを作成する  
1. 秘密鍵ファイルを**Alice**のホームディレクトリに設定する
1. **Bob**のホームディレクトリに公開鍵ファイルを配置する
1. **Bob**が**Alice**によるSSHログインを受け入れるよう設定する
1. **Alice**のホームディレクトリにSSHログイン簡略化のためconfigファイルを配置する

以上だ！
これで**Alice**が

```shell:[Alice@AlphaServer]
$ ssh BravoServer
```

と打つだけで、**Bob@BravoServer**にログインできるぞ！

# 各工程の詳解
## 鍵ペアファイルを作成する
```shell:[Alice@AlphaServer]
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa): #鍵ファイル保存場所。そのままEnter
Created directory '~/.ssh'.
Enter passphrase (empty for no passphrase): #パスフレーズ。面倒なのでそのままEnter
Enter same passphrase agein: #パスフレーズ。面倒なのでそのままEnter
... #なんかわちゃーっと出てくるけど気にしない
```
これで、以下の鍵ペアファイルが生成されるぞ！
ちなみに、ファイルパスの"~"は「ログインユーザのホームディレクトリ」を表しているぞ！

<dl>
  <dt>[Alice@AlphaServer] ~/.ssh/id_rsa</dt>
  <dd>秘密鍵ファイル。　<a href="https://wa3.i-3-i.info/word1830.html">→秘密鍵の解説</a></dd>
  <dt>[Alice@AlphaServer] ~/.ssh/id_rsa.pub</dt>
  <dd>公開鍵ファイル。　<a href="https://wa3.i-3-i.info/word1829.html">→公開鍵の解説</a></dd>
</dl>

### 鍵ペアファイルについては、運用上以下のことを意識するんだ！
* 鍵ペアは必ず対で使う。ほかの鍵ペアとはほぼ100%マッチしないぞ！
* 鍵ペアは内容はさておき、ファイルとしてはただのテキストファイルだ！
* 鍵ペアは生成ユーザやマシン、ファイル名なんかは気にする必要がないぞ！  
  **Carol@CharlieServer**が生成したtemp_keyとtemp_key.pubを_private.key_と_public.key_にリネームして、**Alice**がSSHで**Bob**にログインする際に使用する、ということも問題なくできるぞ！
* 秘密鍵は門外不出だぞ！　生成するだけして、以降決して手を触れるんじゃない！  
  移動したりコピーしたりし始めたら、なんか間違ってると思って立ち止まってくれ！  
  **Alice@AlphaServer**で鍵ペアの生成を行ったのはこのためだ！
* 公開鍵は別に秘密でも何でもないぞ！　外部に漏れたって平気だ！　というかそのためのものだ！
* 公開鍵は**Bob@BravoServer**には必要だが、**Alice@AlphaServer**にとってはもはや不要だ！　どこかにバックアップしておけば削除しても構わん！

## 秘密鍵ファイルを**Alice**のホームディレクトリに設定する
生成した秘密鍵を、**Alice**の `~/.ssh/id_rsa` に配置するんだ！
基本的には、鍵ペアを生成した時点でこの工程は完了しているな！

本当は**Alice**が参照できる場所ならどこでもいいんだが、説明がややこしくなるからおとなしくホームディレクトリに配置しよう。

## **Bob**のホームディレクトリに公開鍵ファイルを配置する
```shell:[Alice@AlphaServer]
$ ssh-copy-id -i ~/.ssh/id_rsa.pub Bob@BravoServer
```
これで**Bob@BravoServer**の `~/.ssh/id_rsa.pub` に**Alice@AlphaServer**の `~/.ssh/id_rsa.pub` がコピーされるぞ！
ついでに後の工程である「**Bob**が**Alice**によるSSHログインを受け入れるよう設定する」も一緒に実施されるぞ！
要するに、**Bob@BravoServer**に一度もログインすることなく全工程が完了してしまうのだ！　らくちん！

### ssh-copy-idコマンドがインストールされていない場合
困ったな！
stfpコマンドを使うなり、scpコマンドを使うなり、フリーソフトのFFFTPを使うなり、何でもいいから**Alice@AlphaServer**の `~/.ssh/id_rsa.pub` を**Bob@BravoServer**の `~/.ssh/id_rsa.pub` にコピーするんだ！

## **Bob**が**Alice**によるSSHログインを受け入れるよう設定する
前工程「**Bob**のホームディレクトリに公開鍵ファイルを配置する」でssh-copy-idコマンドを使ったならこの工程は不要だ！　よかったな！

### ssh-copy-idコマンドがインストールされていない場合
```shell:[Bob@BravoServer]
$ echo ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ rm ~/.ssh/id_rsa.pub #やってもやらなくてもいい
```
を実行するんだ！

ここまでの工程を完了した段階で、**Alice**から**Bob**にSSHログインすることはできるようになったぞ！
ただし、

```shell:[Alice@AlphaServer]
$ ssh Bob@BravoServer -i ~/.ssh/id_rsa -p 22
```
といろいろ指定する必要があってちょっとめんどくさいぞ！（本当はこの例では、一般的なファイル名およびポート番号であるため、オプションは省略しても勝手に補完してくれる）

## **Alice**のホームディレクトリにSSHログイン簡略化のためconfigファイルを配置する
最後の正念場だ！
以下のファイルを**Alice@AlphaServer**の `~/.ssh/config` に配置するんだ。

```:[Alice@AlphaServer]~/.ssh/config
Host BravoServer
    HostName BravoServer
    User Bob
    Port 22
    IdentityFile ~/.ssh/id_rsa
```
これで設定完了だ！

```shell:[Alice@AlphaServer]
$ ssh BravoServer
```
でログインできるぞ！

以上！