使用Net::SSH执行rails console时SSH终端冻结问题排查
Rails控制台导致Web SSH终端无响应的排查问题
我正在构建一个基于Web的SSH终端:UI采用Xterm.js,后端使用Net::SSH,网站与后端通过ActionCable通道(WebSocket)通信。nano、vim等交互工具均可正常运行,但执行bundle exec rails c命令打开Ruby on Rails控制台时,终端会陷入无响应状态。已确认ssh_channel.send_data payload.dig("data", "cmd")已被调用,但channel.on_data不再接收任何数据。
相关代码如下:
# Entry point def start(payload) connect! open_channel! open_connection_thread! broadcast_reply(payload["id"], "login", { result: :successful }) end # Every single key typed in Xterm.js is passed here. def cmd(payload) ssh_channel.send_data payload.dig("data", "cmd") end private attr_accessor :ssh_client, :ssh_channel, :thread def connect! self.ssh_client ||= Net::SSH.start( "host_ip", "username", keys_only: true, use_agent: false, key_data: [ssh_private_key] ) end def open_channel! # rubocop:disable Metrics/MethodLength self.ssh_channel ||= ssh_client.open_channel do |channel| channel.request_pty(term: "xterm-256color") do |ch, success| raise "Error requesting pty" unless success ch.send_channel_request("shell") do |_, result| raise "Error opening shell" unless result end end channel.on_data do |_, data| broadcast_reply(nil, :cmd_output, data) end channel.on_extended_data do |_, _, data| broadcast_reply(nil, :cmd_output, data) end channel.on_close { } end end def open_connection_thread! self.thread ||= Thread.new do # This is blocking and could be done outside a thread because the callbacks are called anyway. # However, this appears safer. ssh_client.loop(0.1) end end
终端冻结状态:显示"Loading Rails environment (Rails x.x.x)"后停止输出,无任何响应。
不清楚该从何处入手排查,任何线索都将十分感激!
注:测试过在线SSH客户端ssheasy.com可正常执行该命令,我的实现哪里存在问题?
内容的提问来源于stack exchange,提问作者James St-Pierre
相关产品推荐
相关产品推荐

