我正在尝试将一些功能写入我的项目的 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 库有任何建议,我将不胜感激。