我试图连接,使用的Net :: SSH,到服务器后立即 登录执行需要根据用户输入的脚本。用户必须输入“1”或“2”,并且将通过在事后终端接收一些数据。

我的问题是,虽然我能够连接,我不能想出一个办法来发送“1个\ n”来的服务器并接收输出。

下面的代码停止在 “INFO - net.ssh.connection.session [80906b74]:channel_open_confirmation:0 0 0 32768”

使用channel.exec( “1个\ n”)而不是channel.send_data勿庸置疑也不起作用。

Net::SSH.start('host', 'user', :password => "pass", :auth_methods => ["password"], :verbose => :debug) do |session|

  session.open_channel do |channel|

    channel.on_data do |ch, data|
      STDOUT.print data
    end 

    channel.send_data( "1\n")

  end

  session.loop
end    

任何想法,任何人?

在预先感谢

有帮助吗?

解决方案

你能确认你的send_data通话的你从远程服务器的提示后发生的?尝试构建在你channel.on_data呼叫send_data块,这样你可以验证你从服务器得到预期的提示你发送一个响应之前。

您可能不希望在这里使用exec是。从文档的净:: SSH ::连接::频道:

  

发送一个信道请求,要求该   给定的命令被调用。

您是想发送文本串回复提示,而不是调用命令。该文档显示正在使用exec发送完整的如“ls -l /家”。

的CLI命令

相反,send_data可能是你想要的东西。该文档显示它使用任意的文本发送诸如channel.send_data("the password\n")。然而,注意,这句话在文档:

  

请注意,它并不会立即发送   跨越信道的数据,但是   而不仅仅是追加给定的数据   到通道的输出缓冲器,   以准备被包装起来,   下一次发出的连接   在接受数据。

您可能想看看的 channel.request_pty 。这似乎是设计用于与基于控制台的应用程序的交互。

如果你想(实质)脚本的SSH会话,你通常会做手工,你可能会发现它更容易使用的expect类似的界面(例如,像的 sshExpect 可能是值得一试)。

其他提示

感谢大家的指针。我已经能够把我的手指上的问题 - 除了使用channel.request_pty但也有必要请求外壳。以下最后按预期方式工作:

Net::SSH.start('host', 'user', :password => "pass", :auth_methods => ["password"]) do |session|

  session.open_channel do |channel|

    channel.request_pty do |ch, success| 
      raise "Error requesting pty" unless success 

      ch.send_channel_request("shell") do |ch, success| 
        raise "Error opening shell" unless success  
      end  
    end

    channel.on_data do |ch, data|
      STDOUT.print data
    end 

    channel.on_extended_data do |ch, type, data|
      STDOUT.print "Error: #{data}\n"
    end

    channel.send_data( "1\n" )

    session.loop
  end  
end    

我并不十分熟悉的Net :: SSH库,所以我不能与每本身帮助,但它听起来就像你可以达到你想要使用的 Capistrano的的东西。

例如我有其连接到远程服务器的任务Capistrano的,运行它期望输入,然后继续命令。 Capistrano的取远程I / O的护理。也许这可能是你的解决方案?

希望它能帮助!

如果我在shell执行"1\n"我得到的回复是:bash: 1: command not found

如果我执行echo "1"我得到:1

您确定要尝试执行要发送的文本?也许你正在寻找类似:

output = ""
Net::SSH.start('host', 'user', :password => "pass") do |ssh|
   output = ssh.exec! "echo 1"
end
puts output

我不精通与LIB,但SSH可以同时打开多个通道。也许服务器只响应第一个默认通道,如果你打开另外一个,你得到一个新的外壳。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top