Ruby Net :: SSH在PTY中获取退出状态

时间:2012-08-22 23:28:31

标签: ruby ssh net-ssh

我正在尝试将一些功能写入我的项目的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.有状态(交互式)通信(这样如果我进入目录,下一个命令将在该目录中发生) 2.能够读取我执行的任何命令的退出状态 3.响应提示的能力

我选择Net :: SSH :: Telnet进行调整,因为它已经提供了1&amp;我想我可以修理它来支持2号 如果有人能看到如何解决这个问题我会非常感激。 Net :: SSH :: Telnet其余部分的来源是:

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

我在这里有一个分支版本的repo,我很乐意接受拉请求。

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

此外,如果有人建议任何其他红宝石图书馆提供这三种功能,我将非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

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

相关的源代码在这里:

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