В настоящее время я работаю над гемом TeamSpeak 3 Ruby, который позволяет взаимодействовать с запросами сервера серверов TeamSpeak. С версии 3.3 он поддерживает соединения S SH. Однако, похоже, что их способ реализации S SH немного отличается. Например:
1002 *
Канал exec
не существует. Это означает, что я, вероятно, должен использовать тип shell
, а команды должны отправляться с Net::SSH::Connection::Channel#send_data
Закрытие каналов с помощью Net::SSH::Connection::Session#close
не оказывает никакого влияния.
Я пытаюсь обернуть все в класс Client
, где в конструкторе я запускаю сеанс S SH и настраиваю канал. Однако, поскольку каналы должны быть зациклены, все застревает в (основном?) Потоке.
module Teamspeak3
class Client
def initialize(...)
@session = Net::SSH.start(...)
@channel = @session.open_channel do |channel|
channel.send_channel_request 'shell' do |ch, success|
raise 'Could not request shell channel' unless success
ch.on_data do |data|
# Data handling
ch.close
end
ch.on_close do |_|
puts 'closing channel'
end
end
end
@session.loop
end
def send_command(command)
@channel.send_data '#{command}\n'
end
end
end
Однако это, конечно, не будет работать из-за потоков, блокируемых @session.loop
. Существуют ли способы, например, сохранения каналов без использования Net::SSH::Connection::Session#loop
или запуска Net::SSH::Connection::Session#loop
в потоке?