1

我正在尝试将一些功能写入我的项目的 Net::SSH::Telnet 库。具体来说,我需要能够读取我编写的任何命令的退出状态。

这是我正在修改的 Net::SSH::Telnet 库的原始来源

@buf = ""
@eof = false
@channel = nil
@ssh.open_channel do |channel|
  channel.request_pty { |ch,success|
    if success == false
      raise "Failed to open ssh pty"
    end
  }
  channel.send_channel_request("shell") { |ch, success|
    if success
      @channel = ch
      waitfor(@options['Prompt'], &blk)
      return
    else
      raise "Failed to open ssh shell"
    end
  }
  channel.on_data { |ch,data| @buf << data }
  channel.on_extended_data { |ch,type,data| @buf << data if type == 1 }
  channel.on_close { @eof = true }
end
@ssh.loop

现在这是我所做的更改:

@stderr = ""
@exit_code = nil
@buf = ""
@eof = false
@channel = nil
@ssh.open_channel do |channel|
  channel.request_pty { |ch,success|
    if success == false
      raise "Failed to open ssh pty"
    end
  }
  channel.send_channel_request("shell") { |ch, success|
    if success
      @channel = ch
      waitfor(@options['Prompt'], &blk)
      return
    else
      raise "Failed to open ssh shell"
    end
  }
  channel.on_data { |ch,data| 
    @stdout << data
    @buf << data
  }
  channel.on_extended_data { |ch,type,data| 
    @stderr << data
    @buf << data if type == 1
  }
  channel.on_request("exit-status") do |ch,data|
    @exit_code = data.read_long
  end
  channel.on_close { 
    @eof = true
  }
end
@ssh.loop

问题是当我运行它时,@exit_code 变量永远不会从 nil 改变。

我这样做的原因是因为我需要三个主要功能: 1. 有状态(交互式)通信(这样如果我 cd 进入一个目录,下一个命令将出现在该目录中) 2. 读取退出状态的能力我执行的任何命令 3. 响应提示的能力

我选择 Net::SSH::Telnet 进行调整,因为它已经提供了 1 和 3。我想我可以修复它以支持数字 2。
如果有人能看到如何解决这个问题,我将不胜感激。Net::SSH::Telnet 其余部分的来源在这里:

https://github.com/jasonkarns/net-ssh-telnet/

我有一个 repo 的分叉版本,我很乐意接受拉取请求。

https://github.com/0x783czar/net-ssh-remotescript

此外,如果有人对提供这三个功能的任何其他 ruby​​ 库有任何建议,我将不胜感激。

4

1 回答 1

1

您可能想查看 Ruby “ssh” gem 和 “remote_task” gem 的源代码。

相关源代码在这里:

它具有处理“cd”命令、i/o 通道和退出状态的代码。

于 2012-08-23T05:06:54.800 回答