Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby telnet到windows 2008,执行命令错误_Ruby_Telnet - Fatal编程技术网

ruby telnet到windows 2008,执行命令错误

ruby telnet到windows 2008,执行命令错误,ruby,telnet,Ruby,Telnet,我尝试使用ruby Net::Telnet连接windows 2008并执行一些命令。但它失败了 如果执行 tn = Net::Telnet::new("Host"=>"walnutserver","Port"=>2300,"Prompt"=> /C:.*>/) tn.login("user","pass") tn.cmd("dir") tn.cmd("dir") tn = Net::Telnet::new("Host"=>"walnutserver","Port

我尝试使用ruby Net::Telnet连接windows 2008并执行一些命令。但它失败了

如果执行

tn = Net::Telnet::new("Host"=>"walnutserver","Port"=>2300,"Prompt"=> /C:.*>/)
tn.login("user","pass")
tn.cmd("dir")
tn.cmd("dir")
tn = Net::Telnet::new("Host"=>"walnutserver","Port"=>2300,"Prompt"=> /C:.*>/)
tn.login("user","pass")
tn.cmd("ls")
tn.cmd("uname")
第一个
tn.cmd(“dir”)
成功,但第二个抛出异常。然后后续命令都失败。经过实验,我发现任何windows命令都会导致这种情况

例外情况:

Timeout::Error: timed out while waiting for more data
        from c:/troy/data/chef/chef-client11/chef/embedded/lib/ruby/1.9.1/net/telnet.rb:558:in `waitfor'
        from c:/troy/data/chef/chef-client11/chef/embedded/lib/ruby/1.9.1/net/telnet.rb:697:in `cmd'
        from (irb):20
        from c:/troy/data/chef/chef-client11/chef/embedded/bin/irb:12:in `<main>'
它不能正常运行
ls
uname
是chef带来的一些linux命令,安装在目标机器上

ruby版本:ruby 1.9.3p286(2012-10-12)[i386-mingw32]

我找到了另一个人 在Stackoverflow上问了同样的问题,但他没有得到答案


需要您的帮助。

已解决。原因是ruby net/telnet库使用错误换行符分隔符。必须为下线(CR+LF),但CR+NULL。但我不知道是谁制造了这个bug,windows还是ruby?我写了一个猴子补丁如下:

class Net::Telnet
    def print(string)
      string = string.gsub(/#{IAC}/no, IAC + IAC) if @options["Telnetmode"]

      if @options["Binmode"]
        self.write(string)
      else
        if @telnet_option["BINARY"] and @telnet_option["SGA"]
          self.write(string.gsub(/\n/n, CR))
        elsif @telnet_option["SGA"]
          self.write(string.gsub(/\n/n, EOL)) ### fix here. reaplce CR+NULL bY EOL
        else
          self.write(string.gsub(/\n/n, EOL))
        end
      end
    end
end

如果你在这个问题上不需要进一步的帮助,请选择正确的答案。;