SSH
sshを、普段自分で使う時の使い方をまとめてみた。
- 普通にログイン
- 暗号鍵作成
- 公開鍵認証でログイン
- ファイル転送
- ポート転送
- Sockプロキシ経由
なお、このページではリモートログイン前なのか後なのか明確にするため、必要のある場合に適宜プロンプトを使いわけることにする。
local$ ← リモートログイン前 (ローカルホスト) remote$ ← リモートログイン後 (リモートホスト)
■ 普通にログイン
ネットワークで接続されたマシンにログインする。これが基本的な使い方。 ユーザーhogeでgunyo.co.jpにログインする場合、
$ slogin hoge@gunyo.co.jp
-Xオプションをつけると、Xの画面を転送できる。例えば
local$ slogin -X hoge@gunyo.co.jp Password: <パスワード入力> remote$ display hogehoge.png
などと入力すると、ログイン先のホストで実行したdisplayが転送されて、自分のマシンにウィンドウとして表示される。相手ホストに存在する画像ファイルが表示できる。ただし、X転送は重いので十分な速度のあるネットワークでないと実用にならない。
■ 暗号鍵作成
sshは、セキュリティのために公開鍵暗号方式による認証を行う事ができる。その際に使う公開鍵は、次のように作成する。
暗号鍵作成コマンドは、
local$ ssh-keygen -t rsa
である。具体的には、次のようにして鍵を生成する。
local$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/ivrc/.ssh/id_rsa): [ENTER] Enter passphrase (empty for no passphrase): [パスフレーズを入力する] Enter same passphrase again: [確認のため再入力] Your identification has been saved in /home/ivrc/.ssh/id_rsa. Your public key has been saved in /home/ivrc/.ssh/id_rsa.pub. The key fingerprint is: d5:53:91:f8:be:17:02:c4:06:8c:85:75:ca:ca:fc:bd ivrc@sora.mitake local$
rsaは暗号の種類であり、他の暗号方式を使う場合は別の名前を書く。ここではrsaを使用するとして続ける。
このコマンドを実行すると、暗号ファイルの保存場所と、パスフレーズを訊かれる。保存場所はデフォルト(.ssh/id_rsa)のままでよいだろう。パスフレーズは、実際にこの鍵を利用して通信を行う前にも訊かれるので、ちゃんと覚えておく必要がある。
これで、id_rsa及びid_rsa.pubという二つの暗号ファイルができる。前者が秘密鍵、後者が公開鍵(PUBlic)である。
■ 公開鍵認証でログイン
ログイン自体の操作は特に変わりない。あらかじめ、リモートホストに公開鍵を登録しておく必要がある。
公開鍵をホストに転送する
公開鍵は通信の相手がもっている必要があるので、通信先のホストに何らかの手段で転送する。公開鍵だからセキュアな方法を使う必要はない。ftp,scp(後述), telnet,フロッピーディスク、メールなどの方法がある。つまりは、identity.pubを相手先ホストに置くことができれば何でもよい。最悪「紙に写して打ち込む」でもよいが、下の例を見たらその気はしなくなるかも。
<公開鍵の例> ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvdzX7yp1CO1Ly69wKpv6L5Xq+ZpjOFDQFoIPzbtlLWKAE 68f58UoDu6PQZW9ztIAwv1edU4ZHhfZE1PvCP5Eo+icxHIULrkHFAJWIJfMugGl8LojyBErY2 MoO+yBLu4U6X92DHuq0+jczNeKWqOdObaP5NUlEQNcnHZ5ya1cGvE= ivrc@sora.mitake
ちなみに、私は「公開」鍵ということでこのHPのバナーにしてしまってるけど、ここまで過剰な手を打つ必要はない(笑)。
ログイン
ここまでできたら、
$ slogin hoge@gunyo.co.jp
とすると、sloginが最初に
Enter passphrase for key '/home/mitake/.ssh/id_rsa':
と聞いてくるようになる。ここでパスフレーズを入力すれば、ログインできる。
ただ、場合によっては、
$ slogin -i ~/.ssh/id_rsa hoge@gunyo.co.jp
というように、秘密鍵の場所を指定してやらないといけないかもしれない。 rsa1暗号を使った場合は、さらに
$ slogin -1 -i ~/.ssh/id_rsa hoge@gunyo.co.jp
というように、暗号の種類を指定する必要がある。
■ ファイル転送
scp
sshの機能として提供される、copyコマンド(cp)のネットワーク版。ローカルホストとリモートホストの間で、あるいはリモートホスト同士の間でファイルをやりとりできる。 sshでのアクセスを許可されているホストなら、ftpを使わなくても普通のcopyと全く同じ感覚でファイルの転送ができるので便利。使い方もいたってシンプル。
$ scp hoge@gunyo.co.jp:/home/hoge/bar.tex honyo@henyo.co.jp:/home/honyo/
つまり、通常のcpのファイル名部分が [user]@[host]:file というフォーマットに変わっているだけなのである。ちなみに、ローカルホストへのアクセスの場合は [user]@[host]:の部分を省略できる(普通のファイル名指定になる)。
rsync with scp
ディレクトリの同期を取るように差分転送を行うrsyncの転送部分に、scpを使用するように設定できる。
$ rsync -e "ssh"
といった感じで使う。具体的には、
$ rsync -avz -e "ssh -i ~/.ssh/id_rsa" ./upload/ hoge@webserver:~/public_html/
などとして使う。rsyncのオプションa,v,zは、それぞれ「ディレクトリ階層を全て転送」「表示を詳細に」「圧縮して転送」を表す。rsyncは、常に必要なファイルしか転送しないので、普通に全部転送するより効率が良い。
■ ポート転送
ポート転送を行うと、ローカルのポートxにアクセスすると、それが実はマシン Cのポートyにつながっている、という状況が作れる。例えば、localhost:6670にアクセスすると、実はirc.fujisawa.wide.ad.jp:6667につながっている、など。
$ ssh -L 6670:irc.fujisawa.wide.ad.jp:6667 hoge.jp
このようにすると、hoge.jpがirc.fujisawa.wide.ad.jpに接続し、ローカルの 6670ポートへの通信が、このhoge.jpを介してirc.fujisawa.wide.ad.jpの6667ポートに転送される。見た目、localhostの6667ポートにircサーバがいるかのように見える。
■ Socksプロキシ経由
まず、connectコマンドがあるかどうか確認する。なければ、手に入れる必要がある。コマンドが手に入ったら、~/.ssh/configを次のように書く。
Host <ホスト名> HostName <ホストのアドレス> Compression yes CompressionLevel 9 ProxyCommand /usr/bin/connect -S プロキシのアドレス:ポート %h %p
ホストのアドレスの所に、Socks経由で接続するホストのアドレスを書き込む。 Compression周りの設定は、あくまで一例。 こうすることで、<ホスト名>で指定したホストに対する通信はSocks経由で行われるようになる。その際、アドレスのかわりにホスト名を指定する。
$ slogin hoge@<ホスト名>
なお、CompressionLevelの数字を大きくする(高圧縮率)と、高速回線では圧縮処理自体が律速になりうるらしい。低速回線では高圧縮の方が通信は断然早い。
