Solaris9+Capistranoはダメだった

LinuxからSolaris9に対してカピストラーノをかけようとしてもどうしてもうまくいきませんでした.
試にVMware Player用にOpenSolarisをダウンロードして試してみたのですが,再現できませんでした(=Capistranoが使えてしまった).そしてもしやと思い,Solaris10に対してカピストラーノをかけると,やっぱり通ってしまいました...結局,Solaris9だけの問題に(私の環境では).
通信自体がうまくいっていない感じなので,CapistranoのせいじゃなくてNet::SSHがうまくいっていないと考え,こんなプログラムを実行してみると,どうやらビンゴっぽいです.

require 'rubygems'
require 'net/ssh'
Net::SSH.start('Solaris9 server','example user',:verbose=>:debug) do |ssh|
  puts ssh.exec("hostname")
end;

結果を抜粋すると,

D, [2010-08-26T11:53:57.333482 #20617] DEBUG --
net.ssh.authentication.session[47273fc]: beginning authentication of`example user'
D, [2010-08-26T11:53:57.333728 #20617] DEBUG -- tcpsocket[4782cf2]:
queueing packet nr 3 type 5 len 28
D, [2010-08-26T11:53:57.333819 #20617] DEBUG -- tcpsocket[4782cf2]: sent 52 bytes
D, [2010-08-26T11:53:57.333945 #20617] DEBUG -- tcpsocket[4782cf2]: read 0 bytes
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/packet_stream.rb:100:in`block in next_packet': connection closed by remote host
(Net::SSH::Disconnect)
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/packet_stream.rb:90:in `loop'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/packet_stream.rb:90:in `next_packet'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:169:in `block in poll_message'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:164:in `loop'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:164:in `poll_message'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:149:in `next_message'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:82:in `block in next_message'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:81:in `loop'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:81:in `next_message'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:110:in `expect_message'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:53:in `authenticate'
        from
/usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh.rb:183:in `start'
        from test.rb:4:in `<main>'

原因は,transport/session.rbのここ.

    def next_message
      poll_message(:block)
    end

ブロッキングモードを指定しているのに,ブロックしないでその時点で通信が無いとすぐに戻ってきてしまうので,

D, [2010-08-26T11:53:57.333819 #20617] DEBUG -- tcpsocket[4782cf2]: sent 52 bytes
D, [2010-08-26T11:53:57.333945 #20617] DEBUG -- tcpsocket[4782cf2]: read 0 bytes

read 0 bytesになって,transport/packet_stream.rbのここではじかれてしまう.

          if fill <= 0
            raise Net::SSH::Disconnect, "connection closed by remote host"
          end

Net::SSHの作者も投げ出してるようなので...ダメかな...

Date: 2009-03-13 00:51
Sender: Jamis Buck

Hey, thanks for the bug report. Sadly, I'm no longer actively
maintaining the Net::SSH library (especially with regards to
solaris--what a nightmare that OS is to support, almost as bad
as windows sometimes). However, if you figure out what is happening,
I'll be happy to accept a patch.

参考までに,Solaris10に対して実行すると,パスワード認証でも公開鍵認証でもちゃんとうまくいきます.

まぁ,ブロッキングモードがうまくいかない箇所を調べると,

          loop do
            result = Net::SSH::Compat.io_select([self]) or next
            break if result.first.any?
          end

          if fill <= 0
            raise Net::SSH::Disconnect, "connection closed by remote host"
          end

と,〜Compat〜と妙なことをやっているので(当時あったバグを回避しているつもりらしい),これを直したりとかやってみようかとは思います.
どうせ消えゆくSolaris9,無駄な作業になるでしょうが...Soraris9でコンパイルがそのままでは通らなかったmemcachedやlibmemcachedもパッチを作ったので,毒食らわば皿までです.