class Net::SSH::Transport::ServerVersion
Negotiates the SSH
protocol version and trades information about server and client. This is never used directly–it is always called by the transport layer as part of the initialization process of the transport layer.
Note that this class also encapsulates the negotiated version, and acts as the authoritative reference for any queries regarding the version in effect.
Constants
Attributes
Any header text sent by the server prior to sending the version.
The version string reported by the server.
Public Class Methods
Instantiates a new ServerVersion
and immediately (and synchronously) negotiates the SSH
protocol in effect, using the given socket.
# File lib/net/ssh/transport/server_version.rb, line 29 def initialize(socket, logger, timeout = nil) @header = String.new @version = nil @logger = logger negotiate!(socket, timeout) end
Private Instance Methods
Negotiates the SSH
protocol to use, via the given socket. If the server reports an incompatible SSH
version (e.g., SSH1), this will raise an exception.
# File lib/net/ssh/transport/server_version.rb, line 41 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