这是我的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
}