我正在尝试将一些功能写入我的项目的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
此外,如果有人建议任何其他红宝石图书馆提供这三种功能,我将非常感谢任何建议。
答案 0 :(得分:1)
您可能需要查看Ruby“ssh”gem和“remote_task”gem的源代码。
相关的源代码在这里:
它具有处理“cd”命令,i / o通道和退出状态的代码。