如何使用Net :: SSH :: Connection :: Channel#request_pty分配远程pty

时间:2014-06-28 10:29:41

标签: ruby pty net-ssh

我正在构建一个raspberry-pi客户端管理器,其中这些客户端通过SSH反向隧道连接到服务器。我正在使用Sinatra frameworknet-ssh库。对于单个命令,这是显而易见的,我使用服务器端事件,我将命令发送到给定的URL。在该操作中,命令被推送到队列,并异步执行,然后只要数据可用,结果就会被推送到事件流连接,这里是命令运行器的伪代码:

 require 'net/ssh'
 # start a separate thread avoid blocking the main thread of the server.
 Thread.start do
      sess = Net::SSH.start(HOST, USER, :password => 'pass', :port => 'port')
      # once a command is pushed to the queue on the dedecated sinatra action
      # the command get executed, once the execution ends this will start listening
      # again
    loop{
      sess.exec! (queue.pop()) do|ch, stream, data|
      #this is the server-sent events stream, here the data is pushed to the client 
      #EventSource 
      stream_event_connection << data
      end
    }
 end

对于单个命令,这没关系,例如像'ls / root'这样的命令。但我需要的是打开一个实时终端(Interective shell),用户输入命令并获得结果,如果它在真正的ssh终端上。我虽然在远程Respberry-PI客户端上打开一个pty,并且使用expect库,这是可能的。 对于请求pty,他们是Net::SSH::Connection::Channel#request_pty方法,但我找不到任何关于如何使用它的示例。任何想法?

1 个答案:

答案 0 :(得分:0)

我相信你所寻找的东西可以像:

shell = sess.shell.open(:pty => true)
...
shell.exec! queue.pop ...

希望有所帮助