svn+ssh

やる度に忘れている気がするので,メモ.
通常,リモートホストにある svn リポジトリにアクセスするには,svn+ssh を使えば良い.
例えば,

svn co svn+ssh://user@host/path

ssh のポート番号を変更する

一番需要があるのがポート番号を変更するというもの.検索してすぐに出てくるのはこのパターン.

${HOME}/.subversion/config

中の

[tunnels]

セクションに

myssh = ssh -p 22222

などと書いておき,svn コマンド実行時に

svn co svn+myssh://user@host/path

とすれば良い.

ssh秘密鍵を変更する

ポート番号変更と同様.

${HOME}/.subversion/config

myssh = ssh -i /path/id_dsa

などと書けば良い.パスを記述するときには変数を使わずフルパスで書く必要があるようだ? (ホームを表す ~ も使えなかった)

svnserve を変更する

たぶんあまり需要はないのだけれど,私にはこれが重要だったりする.
普段自分でインストールした svn を使っているけど,サーバにアクセスしたときにはサーバデフォルトの svn が使われて困る,という場合.
具体的には,両者の svn のバージョンが離れていると,

svn: Expected version '3' of repository; found version '5'

などと言われてリポジトリにアクセスできない場合がある.
このような場合には,サーバにアクセスした時に普段使っている svn に対応した svnserve が起動するようにすれば良い.

svn 専用の公開鍵を作る
ssh-keygen

を使って適当に作成し,公開鍵をサーバの

authorized_keys

に設置.

ログイン時のコマンドを制限する
authorized_keys

中には,

ssh-rsa ...

という行があるはずだが,これを

command="/path/svnserve -t" ssh-rsa ...

と書き直すと,ログイン時に,指定した svnserve が実行されるようになる.
全く余談だが,

command="/path/svnserve -t -r /repospath" ssh-rsa ...

などとしてリポジトリのルートを設定しておくこともできるので,
リポジトリのフルパスを入力するのが面倒くさい,という場合にも使える.

セキュリティ的には,

command="..." no-pty,no-port-forwarding,... ssh-rsa ...

のように色々制限するためのオプションを付けるべきであろう.

ssh秘密鍵変更と組み合わせる

ここまで準備を整えたら,後は

${HOME}/.subversion/config

を編集して,新しく作った svn 専用秘密鍵を指定した myssh を作れば良い.