Ruby Net :: Сеанс повторного использования SSH - PullRequest
0 голосов
/ 09 января 2019

У меня есть несколько способов сделать это:

def method_a
    Net::SSH.start(...) do |ssh|
    end
end

def method_b
    Net::SSH.start(...) do |ssh|
    end
end
def method_c
    Net::SSH.start(...) do |ssh|
    end
end

Каждый метод вызывает Net :: SSH start, которые являются отдельными сессиями SSH и выполняют разные действия.

Есть ли способ повторно использовать сеанс Net :: SSH, чтобы все 3 метода использовали один сеанс?

спасибо.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Путь в Net :: SSH - поставить

@ssh_session = Net::SSH.start( @host, nil, option={:config => true})

в переменную и затем по каждому методу

def method_a
    @ssh_session.exec!("Hello a")
end

def method_b
     @ssh_session.exec!("Hello b")
end
def method_c
     @ssh_session.exec!("Hello c")
end

И, конечно, я помещаю все вышеперечисленное в класс, чтобы я мог инициализировать и запустить сеанс ssh и выполнить команды без переустановки SSH.

0 голосов
/ 09 января 2019

Вне класса вы можете попробовать:


def call
  Net::SSH.start(...) do |ssh|
    method_a(ssh)
    method_b(ssh)
    method_c(ssh)
  end
end

def method_a(ssh)
  ssh.exec(...) 
end

def method_b(ssh)
   ssh.exec(...)
end

def method_c(ssh)
   ssh.exec(...)
end
Если он находится в классе, вы можете определить `attr_reader: ssh` и затем инициализировать его следующим образом:
attr_reader :ssh

def initialize
  @ssh ||= Net::SSH.start(...)
end

С этим вы можете просто определить

def method_a
  ssh.exec(...)
end

То же самое относится и к другим методам. Надеюсь, это поможет?

0 голосов
/ 09 января 2019

Да, определенно вы можете сделать это СУХОЙ.

Вы можете добавить один метод, который принимает имя хоста для соединения Net :: SSH, как показано ниже:

def ssh_exec(hostname)

  Net::SSH.start( hostname, 'user', :timeout => 5, :paranoid => false ) do |ssh|

   ....
  end
end

Затем вы можете вызвать этот метод ssh_exec() с правильным именем хоста, где бы вам это ни понадобилось ...

...