プログラマーがSSH周りで知っておくと良いこと

## はじめに
今となってはこの辺で困る事は無いのですが、初めてLinuxを触った時に基本的な事がわからなくて困ったので同じように困る人向けに書いておきます。
誰かの役に立てれば嬉しいです！

高度な事を書いているのではなく、SSH周りで基本的に使われる事を書いてます。

※なお、クライアントはMacを想定してます。

## SSHって・・・？
`Secure Shell`の略称であり、コマンドです。
通称は`SSH`や`SSHコマンド`などと呼ばれます。

SSHはWindowsでいう`リモートディスクトップ`です。
自分のPCから他のPC（主にサーバー）へ接続して、他のPCを操作するための接続手段です。

Windowsの`リモートディスクトップ`で接続する場合はGUI(`Graphical User Interface`)という画像などを使って視覚的に操作しやすい方法で操作します。
一方で、SSHで接続する場合はCUI(`command line interface`)という黒背景に白文字という質素画面で操作します。

視覚的に優れている`GUI`の方が良さそうですが、実際は`CUI`の方が操作が早くマシンスペックも使わないためなれると楽になります。
（そもそもSSHで接続する先のPCはGUIをサポートしていない場合がほとんど。）

## 普通のSSHコマンド
基本中の基本のコマンド

```sh
$ ssh user@host_name
```

これでSSH接続されます。

## 鍵付きのSSHコマンド
鍵をどこかに置いてから以下のコマンドを実行します。

```sh
$ ssh -i ~/.ssh/鍵ファイル user@host_name
```

`~`はホームディレクトリを指します。
通常`~/.ssh`に鍵を保管するのが普通ですが、別に他の場所に保管していても構いません。

`~/.ssh/id_rsa`に鍵を置いている場合は`-i ~/.ssh/鍵ファイル`で鍵を指定しなくてもこの鍵が自動的に使われます。

## `鍵ちょうだい`といわれた場合の対応
昔、「鍵ちょうだい」と言われて半日くらい固まっていた人が居ました。
知っていれば大した事はないのですが、知らないとフリーズしますw

以下のコマンドで鍵を作成できます。

```sh
$ ssh-keygen -t rsa
```

実施すると以下の確認をされます。

```
Enter file in which to save the key (~/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):
...
```

鍵の保管場所と鍵自体にパスフレーズを付けるか確認されます。
セキュリティを考えるとパスフレーズをつけた方がいいですが、なんらかのシステムに鍵を使わせる場合はパスフレーズを無しにした方が都合が良いこともあります。
（パスフレーズを忘れると、その鍵は使えなくなります。）

ここでできた`id_rsa.pub`を「鍵ちょうだい」と言う人に渡せばOKです。

また、できた鍵は自分以外の人が使えないようにする必要があります。

```sh
$ chmod 600 id_rsa
or
$ chmod 400 id_rsa
```

で鍵にパーミッションを付けましょう。

### Windowsの場合
Puttyなどを使うことで鍵を作成できますので、必要に応じて調べてください。
Windowsで作った鍵(PPK)をMacで使う場合は変換する必要がありますので、ご注意ください。

## 鍵って何？
`ssh-keygen`で鍵を作成すると`id_rsa`と`id_rsa.pub`の二つが出来上がります。
（ファイル名を指定した場合はこの限りではない。）

`id_rsa`は`秘密鍵`と呼ばれ、自分以外の人には渡さないようにしてください。
`id_rsa.pub`は`公開鍵`と呼ばれ、リモート操作をしたいPCに設置してもらう必要があります。

イメージとしては、`秘密鍵`は自分の鍵で`公開鍵`は自分の鍵を型を取ったものになります。
その型を他の家に設置してもらうことで、自分の鍵を使って開けれるようにするイメージです。
なので、開けたい家全てに対して`公開鍵`を設定してもらえば一つの`秘密鍵`で様々な家に入れるようになります。

このように`秘密鍵`と`公開鍵`はペアで扱います。

※鍵を複数作っても良いのですが、管理が面倒になるので一つの鍵を使って公開鍵をあちらこちらに設定してもらう方が良いです。
（ただし、家で使っている`秘密鍵`を職場でも使うと言う事は極力やめましょう。わからないうちは`秘密鍵`はPC毎に作った方が良いです。）

## 公開鍵から秘密鍵を作れるの？
`秘密鍵`があれば`公開鍵`は作れます。
`公開鍵`から`秘密鍵`を作れてしまうと、`秘密鍵`の意味がなくなってしまいます。なので、`公開鍵`から`秘密鍵`を作る事はできません。
(アルゴリズムが公開されているため、理論上は鍵を作り直す事はできますが・・・膨大な時間がかかるため実質`作れ無い`と同義です。)

なお、公開鍵を作成する場合は以下の方法で作成できます。（やった事無いけど・・・）

```sh
$ ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
```

## 公開鍵はどうやって設置するの？
使い側からすると関係無い事ですが、設置するPCのユーザーホームにて以下のコマンドを実施すると設置されます。

```sh
$ cd /home/ユーザー/.ssh/
# authorized_keysが無い場合
$ touch authorized_keys
$ chmod 600 authorized_keys
$ cat ~/id_rsa.pub >> authorized_keys
# 不要になったので消す。
$ rm ~/id_rsa.pub
```

この対応は設置するPCに入れるユーザーに行ってもらう必要があります。

## ホスト名が長いんだけど・・・
ホスト名が長いと毎回以下のコマンドを打たなければなりません。

```sh
$ ssh -i ~/.ssh/hogehogehoe_id_rsa hoge_user@hoge.hoasdaedhoasda.com
```

こんなのいや！
と言う方は`~/.ssh/config`に記載できます。
（普通はここに書くと思います・・・w）

```~/.ssh/config
Host hoge
  HostName hoge.hoasdaedhoasda.com
  User hoge_user
  IdentityFile ~/.ssh/hogehogehoe_id_rsa
```

と記載しておくと

```sh
$ ssh hoge
```

でアクセスできるようになります。
`chef`を使う場合はこの手法がほぼ必須になります。
覚えておきましょう！

### github
ちなみにgithubを使う場合は以下のようになります。
ほぼコピペで使えるはずです。

```~/.ssh/config
Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git
```

## パスワード付きのSSH
最近パスワード認証なんて中々ないけど、該当環境に当たってしまったのでメモ。

```sh:connect.sh
#!/usr/bin/expect

set timeout 2
spawn ssh user@host_name
expect "Password: "
send "パスワード\n"
interact
```

上記のように設定して以下のコマンドでSSH接続する。

```sh
$ connect.sh
```

## その他、知ってると良い事
SSHと併用して以下の２つコマンドを覚えておくと便利です。

### SCP
ファイルやフォルダの転送ができます。

### rsync
フォルダの同期ができます。
大量のファイルを転送する時はSCPよりも早い上に、途中で中断して再開する事もできます。

昔は`rsync`でデプロイをしていた時期もありましたが、事故が多いので小規模サイト以外ではやらない方が無難です。

## まとめ
多分、これだけ知ってればプログラマーがSSHで困る事は無いはずです。
もし困っても調べればすぐにわかるレベルだと思います。

インフラ担当にとっては当たり前の事でも、プログラマーはこの部分が弱い人が多いので覚えておくと良いです。

## 追記
[プログラマーが知っておくと良いLinuxコマンド](http://qiita.com/syou007/items/d77c8c6f1ef9bf1c4dcc)も書きました。
よければみてください。