これが私のシナリオです。
私は 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
}