2017-02-16 69 views
0

我想跑与rubynet::ssh远程命令,并希望能够打印输出stdout,但我没有看到任何东西在下面的代码在印channel.on_data红宝石净:: SSH不标准输出数据打印channel.on_data

见测试代码:

Net::SSH.start('testhost', "root", :timeout => 10) do |ssh| 
    ssh.open_channel do |channel| 
    channel.exec('ls') do |_, success| 
     unless success 
     puts "NOT SUCCEESS:! " 
     end 
     channel.on_data do |_, data| 
     puts "DATAAAAAA:! " # ======> Why am i not getting to here?? <======= 
     end 
     channel.on_extended_data do |_, _, data| 
     puts "EXTENDED!!!" 
     end 
     channel.on_request("exit-status") do |_, data| 
     puts "EXIT!!!! " 
     end 
     channel.on_close do |ch| 
     puts "channel is closing!" 
     end 
    end 
    end 
end 

,输出是:

channel is closing! 

为什么我没有拿到入T他阻止on_data?我想抓住stdout

注意,我知道客户端代码能够sshremote server,因为当我问命令是ls > ls.log我看到ls.log目标主机上。

回答

2

请注意,打开通道是异步的,因此您必须等待通道执行任何有意义的操作,否则您将很快关闭连接。

试试这个:

Net::SSH.start('test', "root", :timeout => 10) do |ssh| 
    ch = ssh.open_channel do |channel| 
    channel.exec('ls') do |_, success| 
     unless success 
     puts "Error" 
     end 
     channel.on_data do |_, data| 
     puts data 
     end 
     channel.on_extended_data do |_, _, data| 
     puts data 
     end 
     channel.on_request("exit-status") do |_, data| 
     puts "Exit" 
     end 
     channel.on_close do |ch| 
     puts "Closing!" 
     end 
    end 
    end 

    ch.wait 
end 
+0

感谢,但我看到'channel.on_close'被称为无添加即使手术需要2分钟'ch.wait',如果它是异步如何on_close工作和即使没有'ch.wait'也不关闭连接? – Jas

+0

如果你不等,那么因为这个代码是异步的,应用程序可以做任何想做的事情,包括退出。如果它退出然后它将关闭所有打开的连接,包括您的异步之一。如果你在这里或任何其他地方使用ch.wait并不重要,但是如果在应用程序结束之前对你输入了重要信息,你应该等待它完成 – SztupY

+0

我尝试运行'sleep 20'作为运行命令而没有'ch.wait',我看到它正在等待它完成。所以从一边等待它完成,但另一方面它不会在'on_data'上发送事件我不明白它是否在等待进程结束为什么不将数据发送到'on_data' ? – Jas