使用Ruby通过SSH创建Telnet连接

时间:2019-01-23 12:50:39

标签: ruby ssh telnet net-ssh

我有一个小问题。首先,在完成这项任务之前,我从未编写过一行Ruby,因此在我的职权范围和舒适性方面有些超出。这很可能是一个愚蠢的问题,但是我一直在寻找什么感觉就像是永恒,却一无所获。

我发现了很多有关如何使用Net :: Telnet从本地计算机进行telnet以及如何使用Net :: SSH:Telnet基于当前SSH会话创建Telnet会话的信息,但是没有找到任何具体的信息处理我的问题。

我需要使用一组凭据通过SSH进入计算机;这没问题:

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

上面的方法很有效,例如,我可以获得ls的输出(我知道,这是最简单的simpleton任务)。

我遇到的问题是我需要使用不同的凭据从SSH会话进行Telnet,所以以下内容与我的目的不符:

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 0 xxxxx” Telnet到localhost,但我一生都无法解决。

我已经尝试在ssh提示符下运行telnet 0 xxxxx,但是只是挂起了,大概是因为显示了用户名/密码提示符。

我在这里迷路了。对于在正确方向上踢球的任何帮助,将不胜感激。

谢谢

CJL。

更新1:

感谢cherrysoft的快速实用的回复。我将研究我们是否能够将文件夹到其服务器上以直接通过SSH触发。这样会使生活更简单!

更新2:

好的,所以在绝望中我尝试了一些尝试,这使我比以前更进一步。下面的代码通过SSH连接,基于SSH创建Telnet会话,通过输出简单的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匹配输出中显示的内容,然后输入Username。这可能是RegEx问题吗?我已经通过Rubular运行了它,而且看起来匹配,但是我可能缺少语法相关的内容?

再次感谢您的时间。

CJL。

更新3和解决方案:

谢谢Kimmo Lehto。只需进行少量的tweeking即可完美运行。它仍然陷在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退出...

2 个答案:

答案 0 :(得分:0)

您可以按以下方式在SSH中执行命令...

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

答案 1 :(得分:0)

您可以尝试使用net-ssh-gateway进行隧道传输,并使用常规的net-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!

快速谷歌搜索并没有提供任何看起来像今天的红宝石的替代telnet库。