1

これが私のシナリオです。

私は 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