/usr/lib/ruby/vendor_ruby/net/ssh/transport/server_version.rb is in ruby-net-ssh 1:2.5.2-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | require 'net/ssh/errors'
require 'net/ssh/loggable'
require 'net/ssh/version'
module Net; module SSH; module Transport
# 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.
class ServerVersion
include Loggable
# The SSH version string as reported by Net::SSH
PROTO_VERSION = "SSH-2.0-Ruby/Net::SSH_#{Net::SSH::Version::CURRENT} #{RUBY_PLATFORM}"
# Any header text sent by the server prior to sending the version.
attr_reader :header
# The version string reported by the server.
attr_reader :version
# Instantiates a new ServerVersion and immediately (and synchronously)
# negotiates the SSH protocol in effect, using the given socket.
def initialize(socket, logger)
@header = ""
@version = nil
@logger = logger
negotiate!(socket)
end
private
# 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.
def negotiate!(socket)
info { "negotiating protocol version" }
loop do
@version = ""
loop do
begin
b = socket.readpartial(1)
raise Net::SSH::Disconnect, "connection closed by remote host" if b.nil?
rescue EOFError => e
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}'" }
unless @version.match(/^SSH-(1\.99|2\.0)-/)
raise Net::SSH::Exception, "incompatible SSH version `#{@version}'"
end
debug { "local is `#{PROTO_VERSION}'" }
socket.write "#{PROTO_VERSION}\r\n"
socket.flush
end
end
end; end; end
|