У меня небольшая проблема. Прежде всего, я никогда не писал ни одной строчки на 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 ...