Ruby Ruby Net:Telnet 连接 windows2008 诡异失败

drift_ic · 2013年05月07日 · 最后由 drift_ic 回复于 2013年05月24日 · 4977 次阅读

问题 我用 Net:Telnet 尝试去连接 windows2008,并执行命令,但是出现一些很诡异的问题,

如果我执行

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

第一个 tn.cmd("dir") 能正常运行,而第二个 tn.cmd("dir") 抛出异常,并且后继无论执行什么命令都是失败的,返回 nil。其中,经过实验,无论是什么 cmd 命令(不只 dir 命令),都会出现相同的问题,执行一个之后,后继的操作都会失败。 异常如下:

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? ,然后就卡在那里了。

但是如果我执行

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

则不会出现上述问题。其中 ls、uname 是在 windows 中安装的 chef 只带的 linux 命令(可能是 cygwin)。

网上有人跟我遇到一样的问题,但是也没有找到解决办法 http://www.ruby-forum.com/topic/1516840

有没有哪位遇到相似的问题,并成功解决了?

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

没有人遇到过吗?自己顶一下。

匿名 #2 2013年05月07日

这个我也是不很懂,但建议可以看看 metasploit 的源码

@yehualiu 谢谢,已经找到问题了,抓包对比了 python 和 ruby 的交互过程,发现是 ruby 的换行符问题——应该是 EOL(CR+LF),但是 ruby 实现是 CR+NULL。也不知道是 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

用 ssh 吧,telnet 不是好的选择

@otecteng 我也想,已经恨死 windows 了,但是 windows 下安装 ssh server 还比较麻烦,而且需要下载第三方的程序,我们目前的使用场景希望目标机器初始化越简单越好,不允许太复杂的操作

我用过 freeSSHd,除了中文乱码问题,其它还可以。或者你可以通过 pstools 这样的工具进行 rpc 操作。

:dump_log 然后看看本地生成的 log 再分析吧 以前做对 H3C 交换机的程序的时候 发现这个办法很有用。

pstools 也考虑过,但是有可能以后会要支持 linux,所以希望是比较通用的方案。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号