Cygwinでsshdを動かそうとしたのですが、サービスとして起動しようとするとどうしてもエラーになって動作しませんでした。色々と調べてみてもダメだし、Cygwinを再インストールしてもダメ。スタンドアロンで動かすことは出来たのにサービスにしようとするとアウトです。
で、やっと動くようになったのですが、結論としては/がuserでmountされていたのが原因でした。昔からずっと使っているので、レジストリに昔のマウントの設定が残っていたために、/や/usr/bin、/usr/libをuserでマウントするようになっていました。これだと、サービスとして動作するときに、SYSTEMアカウントがパスを見つけられないわけですね。
というわけで、レジストリエディタで、HKEY_CURRENT_USER\Software\Cygnus Solutionsと、HKEY_LOCAL_MACHINE\Software\Cygnus Solutionsを削除してからCygwinをインストールしなおしてみたところ、systemでマウントされるようになり、sshdもサービスとして起動するようになりました。
sshdが動くようになったので、SubversionをSSHでトンネル化してみたところ、これまたうまくいきませんでした。ドキュメントどおりにトンネル化するために、serversに以下の記述を追加します。
[groups] test = localhost [test] svn-tunnel-agent = ssh
そして、
$ svn co svn://localhost/svn/q3
のようにすると、
svn: Network connection closed unexpectedly svn: Connection closed unexpectedly
というエラーになってしまいます。そこで試しに、svnが内部的にやっているはずである、ssh経由でのリモートでのsvnserveの起動を試してみます。
$ ssh localhost svnserve -t
そうすると以下のようなエラーになります。
svn: error: cannot set console input codepage (code 6)
それではと思って、sshでログオンした上でsvnを実行するとやはり同じエラーが発生します。調べてみたところ、内部でSetConsoleCPを呼んでいて、リモートで実行している際にはコンソールがないためにエラーになっている模様です。これは、本体を直さないとどうしようなさそうですね。
試しにソースからビルドしてみてSetConsoleCPを呼んでいるところをコメントアウトしてみることにしました。何とかビルドできたので、subversion/libsvn_subr/cmdline.cを修正してSetConsoleCPを呼び出さないようにして再びビルドします。
そして出来たsvnserve.exeを元のものと入れ替えます。この状態で試しに、
$ ssh localhost svnserve -t
してみるとエラーにならなくなっているので期待大です。そこで、まずは普通にデーモンモードで立ち上げてつなげてみると、レスポンスがおかしいということです。どうやら、配布バージョンと最新のソースの間で何か変更があったようです。仕方がないので、svn.exeもビルドしたものに置き換えます。そうすると、チェックアウトできるようになりました。
ここで、serversファイルを編集してsshを使うようにしてみたもののまるでsshを使ってくれません。そういえば、どこかで設定ファイルの書き方が変わったようなことを見た記憶がありますが、どこで見たか思い出せず。しょうがないので、スキーマとしてsvn+sshを直接指定してみます。
$ svn checkout svn+ssh://localhost/home/svn/q3
これでssh経由でチェックアウトできるようになりました。しかしいまいち安定しません。チェックアウト途中でハングアップしてしまうことも何度か。sshを通さないと問題ないので、おそらくcygwinのsshdが安定していないのではないかという気がしますが、どうしたもんでしょう。
さらにこれをゲートウェイのSSHでトンネル化します。まず、以下のようにしてトンネルを作ります。
ssh -1 -L 10022:aaa.bbb.ccc.ddd:22 gateway
aaa.bbb.ccc.dddはレポジトリのあるPCのIPアドレスです。それから、~/.ssh/configを以下のようにしてポートとして10022を使うようにします。
Host localhost Protocol 1,2 Port 10022
この状態で、localhostにsvnでアクセスします。
$ svn co svn+ssh://localhost/home/svn/q3
これで、ゲートウェイのトンネルを通って、レポジトリのあるPCにsshでログインし、svnserveを立ち上げて通信することが出来るようになりました。
ゲートウェイの設定をいじれるなら、こんなことをしなくても適当なポートをレポジトリのあるPCの22にフォワードしてしまうという手もあるのですが、穴は少ない方が管理が楽ですので。