[メモ] ssh でリモートログイン

ssh でリモートログインするときはパスワードを手打ちしていたけど、リモートでちょっと大規模なファイルの編集をする必要が出てきて、 Emacs の tramp をきちんと使いたくなったのでパスワードをいちいち打つのが面倒になってきた。
そこで、公開鍵と秘密鍵を設定してパスワードなしでログインできるようにした。
以下設定の手順:

1. 秘密鍵の作成

ローカルから

local$ ssh-keygen

と入力。

Enter file in which to save the key (/Users/dai/.ssh/id_rsa):

はそのままで Enter、

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

パスフレーズを2度入力。これで秘密鍵 (と公開鍵) ができた。

2. リモート側に公開鍵を設定

scp でリモートに鍵を転送して、 authorized_keys を設定する。

local$ scp ~/.ssh/id_rsa.pub user@www.host.com:
local$ ssh user@www.host.com
remote$ mv id_rsa.pub .ssh/authorized_keys
remote$ chmod 600 .ssh/authorized_keys

でOK. ただし、 authorized_keys がすでに存在する場合 (すでに他のマシンからの公開鍵を設定している場合) は

remote$ cat id_rsa.pub >> ~/.ssh/authorized_keys
remote$ rm id_rsa.pub

と追記する。以上でとりあえず終了。

local$ ssh www.host.com

でパスワードなしでいけるようになる。あ、 Mac の場合はキーチェーンアクセスがどうとか出てきた。
ホストに別名を付けたい場合や、複数リモートの設定をする場合はさらに以下を。

3. 複数リモートの設定を書く

2. までの手順リモートマシンごとにやる。 id_rsa ファイルは上書きされないように適宜名前を変えておく。
ローカルの ~/.ssh/config を開いて、

Host host1
HostName www.host1.com
Port 22
User hoge
IdentityFile ~/.ssh/id_rsa_host1

Host host2
HostName www.host2.com
Port 22
User fuga
IdentityFile ~/.ssh/id_rsa_host2

と記入する。これで、

local$ ssh host1

とすれば hoge@host1 に、

local$ ssh host2

とすれば fuga@host2 に ssh できるようになる。

4. .zshrc にホスト名を記述

.zshrc に

zstyle ':completion:*' users-hosts host1 host2

などと記述しておけば

$ ssh <TAB>

で補完してくれる。 user@ を前に付けてもいける。

5. Emacs の tramp を使う

普通に find-file するとき、

/ssh:host1:/path/to/file

でリモートのファイルを開けるようになる。タブでの補完もきく。保存すれば自動でリモートに転送してくれる。
ただし、 recentf-mode を使っていると、 Emacs 起動時にいちいちリモートアクセスが発生して起動がかなり遅くなってしまうので

(setq recentf-exclude '("^/[^/:]+:"))

と書いておくとこれらのファイルをチェックしないようになる。