2013-05-07 124 views
0

我試圖用ruby Net :: Telnet來連接Windows 2008並執行一些命令。但它失敗了。紅寶石遠程登錄到Windows 2008,執行命令錯誤

如果執行

tn = Net::Telnet::new("Host"=>"walnutserver","Port"=>2300,"Prompt"=> /C:.*>/) 
tn.login("user","pass") 
tn.cmd("dir") 
tn.cmd("dir") 

第一tn.cmd("dir")是成功的,但第二個罰球exceptions.And那麼後續的命令都失敗了。實驗後,我發現任何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>' 

使用sock.sysread()方法來讀取響應,我發現,終端被阻斷,顯示dir\r\n0x00More?

BUF如果執行

tn = Net::Telnet::new("Host"=>"walnutserver","Port"=>2300,"Prompt"=> /C:.*>/) 
tn.login("user","pass") 
tn.cmd("ls") 
tn.cmd("uname") 

It't正常運行ls,uname是安裝在目標機器上的主廚帶來的一些linux命令。

紅寶石版本:紅寶石1.9.3p286(2012年10月12日)[I386-的mingw32]

我發現別人 問#1同樣的問題,但他並沒有得到解決。 http://www.ruby-forum.com/topic/1516840

需要你的幫助。

回答

0

解決了。原因是ruby net/telnet庫使用錯誤換行分隔符。必須是EOL(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 
+0

如果你不需要這個問題的進一步的幫助,選擇一個正確的答案。 – biphobe 2013-05-14 09:23:17