基本的な概念 
sshとは 
sshは強力なセキュリティを備えたリモートログインプログラムです。
- 今どきのLinuxやBSDなら最初からインストールされています。
- LinuxやBSDで使っているsshの実装をOpenSSHといいます。
- 通信内容を暗号化します。
- 公開鍵認証を使えます。
- ftp、cvs、Xなど他のプロトコルをトンネル化して安全にできます。
- WindowsでもCygwin版のsshdを使えばsshサーバを立てられます。
パスワード・パスフレーズ 
「パスフレーズ」というのは、秘密鍵を使うときに聞かれるもの。
パスワード認証の「パスワード」とは別ものなので注意が必要です。
鍵作成してログインできるようにする 
OpenSSHを使う場合 
Cygwin の ssh や Linux の ssh クライアントから接続するには、以下の方法で鍵を作成・登録します。
1.鍵作成。
LinuxやCygwinなら
ssh-keygen -t rsa
このときパスフレーズを空文字列にすると、ログイン時にパスフレーズを聞かれなくなります。
Puttyを使う場合はまた違います。
2.秘密鍵 id_rsa をクライアント(接続元)の ~/.ssh に保存。
3.公開鍵をホスト(接続先)の authorized_keys に追加。
これはサーバのrootに公開鍵を渡して、実行してもらうことになるでしょう。
cat id_rsa.pub >> ~/.ssh/authorized_keys
4.クライアントから接続
初回のみメッセージが表示され、確認を求められます。
yes と答えると、サーバが known_hosts に追加され、以降聞かれなくなります。
いったん鍵を作ったら、他のサーバにログインするには、
id_rsa.pub をそのサーバの ~/.ssh/authorized_keys に追加するだけでOKです。
ログインするサーバごとに鍵を生成する必要はありません。
sshの鍵ファイル一覧 
↓テーブルにすると正常に表示されない。なぜ?
,identity,SSHプロトコル Ver.1の秘密鍵
,identity.pub,SSHプロトコル Ver.1の公開鍵
,id_dsa,SSHプロトコル Ver.2(DSA)の秘密鍵
,id_dsa.pub,SSHプロトコル Ver.2(DSA)の公開鍵
,id_rsa,SSHプロトコル Ver.2(RSA)の秘密鍵
,id_rsa.pub,SSHプロトコル Ver.2(RSA)の公開鍵
,known_hosts,ログイン先として認めたホスト(接続元に保存)
,authorized_keys,ログインを受け付ける公開鍵(接続先に保存)
※TODO:puttyが作る鍵の名前を追加。
authorized_keysファイルのフォーマット 
プロトコル バージョン 1 の公開鍵では、空白で区切られた以下の項目が格納されています:
オプション、ビット数、指数、係数 (modulus)、鍵のコメント。
プロトコル バージョン 2 の公開鍵では、以下の項目が格納されています:
オプション、鍵の種類、 base64 エンコードされた鍵本体、鍵のコメント。
オプション項目はなくてもかまいません。
http://www.unixuser.org/~euske/doc/openssh/jman/sshd.html
例:
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA8cmkP3+XRNqCO54qrmclySNIS5EV6DR99tX113Dq/bBTgN1IkSywEVbbZAWgrvJBjyjWIZH3kZXLINe45FMzrL1rGUv7RZOJgNcELrr56TXSf98iUWwR+9yqZzqg7chOVord4okrHq2XiB3gR1Olg3oyh457ScUcPB4Q/OCyp3fpsbaRCfIdCVurqqS+71sIZuE7vOPNT3pdqZeKGiG48rNdK5c5HnOyPBhVbEAJ/X20GcBzmebDTSfBEc4cRqqXVwQQxk+bWojvHIi7oOWAHsT56tM5g5AhQn6AFBXA3a9QzgC+bpBVItLh2vxbATZbnCbK7SmlK1Ofu7LLCgspaQ== xxxx@global
最後の「shoutarou.aoyama@global」はコメントなので、ここにどのマシンで使う鍵なのかなどを書くことができます。
Puttyの場合 
まだ書いていません。
1. puttygen.exeを起動して「Generate」ボタンを押します。
2. ダイアログが開くので、ゲージがいっぱいになるまでマウスをひたすらでたらめに動かして鍵生成します。
3. パスフレーズを入力して「Save Private Key」で鍵を保存します。
4. 公開鍵をコピペしてサーバの authorized_keys に追加します。
sshサーバ管理 
サーバ起動・終了 
Fedora Core の場合:
# 起動
service sshd start
# 終了
service sshd stop
# 再起動
service ssshd restart
サーバ設定 
とりあえず
- パスワード認証不可。
- rootログイン不可。
- プロトコルは2のみ使用(プロトコル1はやや脆弱らしい)
くらいしておけば十分かと。
ポート番号を変えるだけでスクリプト攻撃はほぼ防げるようです。
sshでファイルを転送 
scp 
書式
scp ファイル名 [ユーザ名@]ホスト名:コピー先
例:
scp hoge global.skill.ne.jp:
rsync + ssh 
scp ではファイルを1個1個コピーしなければならないのに対し、rsync と組み合わせると
ディレクトリを一気にコピー/同期させることができます。
例:
$ rsync -avz -e "ssh -p SSHのポート番号 -i 秘密鍵 -l ユーザ名" コピー元ディレクトリ global.skill.ne.jp:コピー先ディレクトリ
内部動作:
1. ローカルで起動された rsync は
2. ssh でリモートへ login し
3. リモート側でも rsync を起動する。
4. その後、ローカルの rsync とリモートの rsync とで通信を行い、バックアップを行う。
よって、リモートでrsyncのポート(通常は873)が開いていないといけないと思われる。
(未調査)
Tips 
クライアント設定 
「~/.ssh/config」で設定。
例:
Host global
HostName global.skill.ne.jp
user aoyama
Port 10372
ServerAliveInterval 60
こう書いておくと、
$ ssh global
と打つだけでポート10372を使い、ユーザ名をaoyamaにして接続できます。
ServerAliveIntervalは、何もしていないとき勝手に接続が切れてしまうのを防ぐため。
その他役に立ちそうなオプション:
PubkeyAuthentication no # 公開鍵認証を行わない。パスワード認証を使いたいのに鍵のパスフレーズを聞かれてしまうときに便利。
接続元によって.bashrcを使い分ける 
sshで接続するとSSH_CLIENTやSSH_CONNECTIONという環境変数が設定されます。
そこで~/.bashrcに次のように書いておくと、接続元によって設定を切り替えることができます。
# 219.101.39.210から接続しているときはUTF-8を、そうでないときはeucJPを使う。
# =~は正規表現マッチング。man bash参照。
if [[ "$SSH_CONNECTION" =~ '^219\.101\.39\.210.*' ]]; then
export LANG=ja_JP.UTF-8
else
export LANG=ja_JP.eucJP
fi
sshでは他にも
- SSH_ORIGINAL_COMMAND
- SSH_TTY
- SSH_ASKPASS
- SSH_AUTH_SOCK
などの環境変数が設定される。詳しくはman ssh。
リモートでコマンドを実行する 
Cygwinのsshを使う場合
ssh global -l aoyama ls
puttyのplinkを使う場合:
plink -load global -l aoyama ls
接続後、すぐに screen を起動する 
ssh -t global screen -D -RR
man ssh に書いてあるらしい。
トラブルシューティング 
ログインできない 
SSHの設定方法の質問です。
http://q.hatena.ne.jp/1149079199
より。次のことを確認してみましょう。
- クライアント側の/etc/ssh/ssh_config、~/.ssh/configでサーバBに対する設定、~/.ssh/id_rsaの鍵が使われているかどうか
- サーバ側の/etc/ssh/sshd_configで公開鍵認証が有効になっているかどうか、~/.ssh/authorized_keysでクライアント側の~/.ssh/id_rsaに対応する公開鍵が入っているかどうか
- サーバ側の~/.ssh/authorized_keysのパーミッションが600になっているかどうか
- サーバ側の~/.sshのパーミッションが700になっているかどうか
- ssh -vでつないでうまくいっているサーバへの接続と失敗するサーバへの接続を比較する。
- ssh -vでわからなければssh -vvやssh -vvvなどと-vを増やして試してみる。
妙に接続が遅い 
sshdが接続元の名前を解決しようとしている(しかしできない)という場合は接続が遅くなります。
サーバの /etc/hosts に接続元を書いておくか、sshd_configにUseDNS noと書いて名前解決しないようにsshd_configに書いておくと解決します。
ただしUseDNSはsshd 3.7あたりから導入されたようで、古いsshdでは使えません。