1

这是我的secnario,

我正在用 Net::Telnet::new 编写一个 ruby​​ 客户端,另一端服务器是一个 ubuntu。我添加了一个事件机器来监视由 Net::Telnet::new 创建的套接字。

这是我的问题,例如,我使用 cmd 方法发送命令:

client.cmd("ping 127.0.0.1") 然后eventmachine继续输出响应。我想停止 ping 进程并停止 ping 响应,所以我需要向服务器发送命令“Ctrl+z”或其他内容(就像我们使用 telnet 终端时一样)。

那么我怎样才能用红宝石做到这一点?我试过 238.chr、237.chr、236.chr。那些没有用。我也尝试发送 26.chr,这个停止了一些东西。但是我的代码挂在那里,在我发送 26.chr 后,我无法使用 cmd 方法发送另一个命令。

这是一些代码,请忽略ws.onopen,ws.onmessage,这些只是eventmachine中的websocket。

     ws.onopen    { 
                puts "Web socket is opened"
                ws.send "terminal to the node"
                          $nodeSocket = Net::Telnet::new("Host" => "10.4.0.50","Timeout" => 10,"Prompt" => /login/ )
                          puts $nodeSocket


                $nodeSocket.cmd("String" =>"user","Match" => /Password/) { |c| ws.send c}
                $nodeSocket.cmd("String" => "password","Match" => /\$/) { |c| ws.send c}




               Thread.new do  
                   EM.run{
                          $conn = EM.watch $nodeSocket.getSocket,Foo,ws
                          $conn.notify_readable = true
                   }
                end


      }

      ws.onmessage { |msg| 
                begin 
                    puts msg

                      if msg =~ /command:(.*)/
                        puts $1
                        if $1 == "stop" 

                              $nodeSocket.cmd(26.chr) 
                              $nodeSocket.cmd("ls -l") 
                              $nodeSocket.cmd("pwd") 

                        else 

                              $nodeSocket.cmd($1) 
                        end
                      end
                      ws.send msg
                rescue
                    puts "there's an error happened"
                end



      }
4

0 回答 0