class Net::SSH::Transport::ServerVersion
the authoritative reference for any queries regarding the version in effect.
Note that this class also encapsulates the negotiated version, and acts as
layer.
transport layer as part of the initialization process of the transport
and client. This is never used directly–it is always called by the
Negotiates the SSH protocol version and trades information about server
def initialize(socket, logger, timeout = nil)
Instantiates a new ServerVersion and immediately (and synchronously)
def initialize(socket, logger, timeout = nil) @header = String.new @version = nil @logger = logger negotiate!(socket, timeout) end
def negotiate!(socket, timeout)
reports an incompatible SSH version (e.g., SSH1), this will raise an
Negotiates the SSH protocol to use, via the given socket. If the server
def negotiate!(socket, timeout) info { "negotiating protocol version" } debug { "local is `#{PROTO_VERSION}'" } socket.write "#{PROTO_VERSION}\r\n" socket.flush raise Net::SSH::ConnectionTimeout, "timeout during server version negotiating" if timeout && !IO.select([socket], nil, nil, timeout) loop do @version = String.new loop do begin b = socket.readpartial(1) raise Net::SSH::Disconnect, "connection closed by remote host" if b.nil? rescue EOFError raise Net::SSH::Disconnect, "connection closed by remote host" end @version << b break if b == "\n" end break if @version.match(/^SSH-/) @header << @version end @version.chomp! debug { "remote is `#{@version}'" } raise Net::SSH::Exception, "incompatible SSH version `#{@version}'" unless @version.match(/^SSH-(1\.99|2\.0)-/) raise Net::SSH::ConnectionTimeout, "timeout during client version negotiating" if timeout && !IO.select(nil, [socket], nil, timeout) end