【问题标题】:Powershell: Listening for Telnet response textPowershell:监听 Telnet 响应文本
【发布时间】:2012-12-02 19:55:17
【问题描述】:

这是可能非常简单的特定现实问题之一。我对旧的 BBS/终端代码太生疏了,现在不记得了。

我有一个 Powershell 脚本,它打开到远程服务器的 Telnet 会话,然后根据文本文件向该服务器发出命令。它还被设计为将从服务器返回的所有文本吐出到日志中。

    ## Read output from a remote host
    function GetRemoteOutput
    {
      ## Create a buffer to receive the response
      $buffer = new-object System.Byte[] 1024
      $encoding = new-object System.Text.AsciiEncoding

      $outputBuffer = ""
      $foundMore = $false

      ## Read all the data available from the stream, writing it to the
      ## output buffer when done.
      do
      {
        ## Allow data to buffer for a bit
        start-sleep -m 10000

        ## Read what data is available
        $foundmore = $false
        $stream.ReadTimeout = 12000

        do
        {
          try
          {
            $read = $stream.Read($buffer, 0, 1024)

            if($read -gt 0)
            {
              $foundmore = $true
              $outputBuffer += ($encoding.GetString($buffer, 0, $read))
              write-host $outputbuffer
            }
          } catch { $foundMore = $false; $read = 0 }
        } while($read -gt 0)
      } while($foundmore)

      $outputBuffer
    }

当我必须等待 Telnet 会话另一端的服务器表明它已准备好时,就会出现问题。上面的实现简单地使用了 Start-Sleep(十秒!),然后发送下一个命令'blind'。

我想做的是,启动一个缓冲区以获取会话服务器发送到我的盒子的内容,然后根据我是否在该缓冲区中看到从终端会话返回的提示触发下一个命令。

示例(这是来自 IBM DS400 San 控制器的提示,脚本的目标)

xxxxxxSANCTRLnnn[A]>

现在,它们的名称将根据它们的位置 (xxxxxx)、正在访问的实际 SAN (nnn) 以及我正在访问的 SAN 中的两个控制器模块(A 或 B)中的哪一个而改变。因此,regex -match 语句对于系统提示的实际“模式匹配”非常有用。我对脚本专家的问题是,哪些方法可以:

1) 让脚本在缓冲终端输出时暂停 2)将该输出传递到日志文件 3) 对预期的“提示”进行模式匹配,然后发出下一个命令

提前致谢! :D

【问题讨论】:

  • 我希望用于提示匹配的正则表达式是:$promptmatch = "^\w{6}SANCTRL\d{3}\[[A,B]\]\>"

标签: powershell match telnet


【解决方案1】:

那么……直到?

做{start-sleep -sec 1; (并刷新从服务器读取)} 直到 (!$foundMore)

【讨论】:

  • 这可能是一种可能性。我会调查的!谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 2018-11-01
  • 1970-01-01
  • 2010-12-08
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多