Создайте соединение Telnet через SSH, используя Ruby - PullRequest
0 голосов
/ 23 января 2019

У меня небольшая проблема. Прежде всего, я никогда не писал ни одной строчки на Ruby, пока мне не дали эту задачу, так что это несколько выходит за рамки моей компетенции и комфорта. Это может быть глупый вопрос, но я искал ощущение вечности и ничего не нашел.

Я нашел много информации о том, как установить telnet с моего локального компьютера с помощью Net :: Telnet и как создать сеанс Telnet на основе текущего сеанса SSH с использованием Net :: SSH: Telnet, но не нашел ничего конкретного занимаюсь моей проблемой.

Мне нужно подключиться по SSH к компьютеру, используя набор учетных данных; это не проблема:

objSsh=Net::SSH.start("xxx.xxx.xxx.xx",
                        "sshUser", 
                        :Password=>"sshPass")

Вышеприведенное работает хорошо, и я могу получить, например, вывод от ls (я знаю, самые простые из простых задач).

Проблема, с которой я столкнулся, заключается в том, что мне нужно подключиться к Telnet из сеанса SSH с использованием других учетных данных, поэтому приведенное ниже не соответствует моей цели:

ssh = Net::SSH.start("xxx.xxx.xxx.xxx",
      :username=>"sshUser",
      :password=>"sshPass"
)
s = Net::SSH::Telnet.new(
      "Dump_log" => "/dev/stdout",
      "Session" => ssh
)

Это означало бы, что Telnet использует те же учетные данные, и это не то, что мне нужно.

Но в то же время я не могу использовать нижеприведенное, потому что он просто попытается подключиться к Telnet с исполняющей машины, а это не то, что требуется.

s = Net::SSH::Telnet.new(
    "Dump_log" => "/dev/stdout",
    "Host" => "0",
    "Username" => "telnetUser",
    "Password" => "telnetUser"
)

По сути, мне нужно SSH к машине, используя разные учетные данные, Telnet к локальному хосту, используя "telnet 0 xxxxx", но не могу понять, как это сделать.

Я попытался запустить telnet 0 xxxxx в командной строке ssh, но он просто зависает, предположительно потому, что отображаются запросы имени пользователя / пароля.

Я брожу в запутанных кругах здесь. Буду признателен за любую помощь в отношении удара в правильном направлении.

Спасибо

CJL.

Обновление 1:

Спасибо cherrysoft за ваши быстрые и полезные ответы. Я посмотрю, можем ли мы перебрасывать файлы на их серверы для прямого запуска через SSH. Это сделало бы жизнь проще!

Обновление 2:

ОК, поэтому в отчаянии я что-то попробовал, и это сделало меня на шаг дальше, чем я делал раньше. Следующий код подключается через SSH, создает сеанс Telnet на основе SSH, гарантирует, что все по-прежнему работает, путем вывода простой команды SSH, пытается запустить сеанс Telnet .... и затем завершается неудачей.

#Create SSH connection.
objSsh=Net::SSH.start("xxx.xxx.xxx.xxx",
                    "sshPass", 
                    :password=>"sshPass")
#Crete a Net:SSH:Telnet object based on the SSH connection.
objTelnet = Net::SSH::Telnet.new("Session" => objSsh)
#Ensure simple SSH commands can still be run by outputting ls results.
p objTelnet.cmd("ls")
#Try to kick off a telnet session and show what is displayed.
p objTelnet.cmd("telnet 0 xxxxx")
#Wait for the Username prompt.
objTelnet.waitfor("Match" => /.*?Username:.$/)
#Enter username.
objTelnet.puts("telnetUser")
#Wait for password prompt.
objTelnet.waitfor("Match" => /.*?Password:.$/)
#enter password.
objTelnet.puts("telnetPass")
#Try the command.
p objTelnet.cmd("cluster stats")

Он достигает соединения с Telnet, но вызовы Waitfor, похоже, не работают. Когда запускается строка ниже, результатом в выводе будет запрос имени пользователя:

objTelnet.cmd("telnet 0 xxxxx")

"telnet 0 xxxxx\nTrying 0.0.0.0...\r\nConnected to 0.\r\nEscape character is '^]'.\r\nUsername: "

Я бы ожидал, что Waitfor будет совпадать с тем, что было показано в выводе, и для имени пользователя, которое затем будет введено. Возможно, это проблема RegEx? Я запустил его через Rubular, и кажется, что он совпадает, но мне может быть не хватает синтаксиса?

Еще раз спасибо за ваше время.

CJL.

ОБНОВЛЕНИЕ 3 И РАЗРЕШЕНИЕ:

Спасибо, Киммо Лехто. С незначительными изменениями, которые работали отлично. Он все еще зависал при входе в систему через Telnet, но при передаче учетных данных, как показано ниже (в отличие от пользователя / прохода), это срабатывает!

loginInfo = {"Name" => telnetUser,
          "Password" => telnetpass,
          "LoginPrompt" => /Username:/
         }
objGateway = Net::SSH::Gateway.new(hostIp, user, :password => password)
objLocalPort = objGateway.open("localhost", port)
objTelnet = Net::Telnet::new("Host" => "127.0.0.1", "Port" => objLocalPort)
objTelnet.login(loginInfo) 
objTelnet.cmd("cluster lrm res sum") { |c| print c}
objTelnet.close
objGateway.shutdown!

Еще раз спасибо за ваше время и усилия по решению этой проблемы.

CJL out ...

Ответы [ 2 ]

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

Вы можете попробовать использовать net-ssh-gateway для туннелирования и использовать обычный net-telnet для telnet (который сам по себе ужасно устарел и net-telnet-ssh является заменой этой ужасности):

gateway = Net::SSH::Gateway.new(ssh_host, ssh_user)
local_port = gateway.open(target_host, target_port)
telnet = Net::Telnet::new("Host" => "localhost", "Port" => local_port)
telnet.login(telnet_user, telnet_password)
telnet.cmd("ls -al") { |c| print c }
telnet.close
gateway.shutdown!

Быстрый поиск в Google не привел к появлению альтернативных библиотек telnet, которые выглядели бы как современный рубин.

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

Вы можете выполнять команды в SSH следующим образом ...

Net::SSH.start('host', 'user', password: "password") do |ssh|
  output = ssh.exec!("echo {your command} | telnet {host} {port}")
  puts output
end
...