【问题标题】:Sending complex, multi-line command via plink to Cisco Router =Unexplained behavior通过 plink 向 Cisco 路由器发送复杂的多行命令 = 无法解释的行为
【发布时间】:2015-07-18 02:28:54
【问题描述】:

我正在尝试以相对简洁的方式完成以下代码部分(插入到更大的脚本中)。以这种方式发送多个命令我没有任何问题。但是,有些东西会导致多行命令最终阻塞。 Cisco 命令的语法似乎是正确的。我不确定我是否遇到了某种字符限制,或者我是否需要转义 $showintstatusCommands 中的特定字符,但我尝试的任何方法似乎都不起作用。

这段代码:

$BGPInterface = "GigabitEthernet0/2"
$showintstatusCommands =  "`nterminal length 0`nsho int $BGPInterface | include reliability|errors`nsho log | include $Date.*LINK-3-UPDOWN.*$BGPInterface`nexit"
($Response = $showintstatusCommands | C:\Windows\plink.exe -ssh -2 -l $Credential.GetNetworkCredential().username -pw $($Credential.GetNetworkCredential().password) $DeviceName -batch) 2>$null | out-null

当我显示变量的内容时产生以下内容。 $ShowIntstatusCommands 在本地回显时似乎是正确的。请注意,第 3 行的结尾被切断(末尾缺少数字 2 字符)。下一行是上一行的一些奇怪的残差,以$nclude开头。

PS C:\Users\MKANET\Desktop\test> $Response
CISCO-ROUTER#
CISCO-ROUTER#terminal length 0
CISCO-ROUTER#sho int GigabitEthernet0/2 | include reliability|errors

   reliability 255/255, txload 1/255, rxload 1/255

0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored

0 output errors, 0 collisions, 3 interface resets

CISCO-ROUTER#sho log | include Jul 17.*LINK-3-UPDOWN.*GigabitEthernet0/

$nclude Jul 17.*LINK-3-UPDOWN.*GigabitEthernet0/2

CISCO-ROUTER#
CISCO-ROUTER#exit
PS C:\Users\MKANET\Desktop\test> $showintstatusCommands
terminal length 0
sho int GigabitEthernet0/2 | include reliability|errors
sho log | include Jul 17.*LINK-3-UPDOWN.*GigabitEthernet0/2
exit

【问题讨论】:

  • 您使用的是哪个版本的 PowerShell?如果您将变量放在分配给{} 中的 $showintstatusCommands 的字符串中,是否有帮助? "...${BGPInterface}...${Date}...${BGPInterface}.."?
  • 我使用的是 Powershell 4.0;但是,无论我做什么;我希望它在 Powershell 2 下工作。我没有尝试过括号。感谢您的建议!我将能够在星期一测试这个。顺便说一句:我已经尝试过使用 $($BGPInterface) 没有任何成功。我想知道是否有某种字符限制。变量 $BGPInterface 的最后一个字符不可见;并且,下一行输出变得混乱。
  • 嗯,如果 $($BGPInterface) 没有修复,那么 ${BGPInterface} 也不会修复。它不认为这是字符限制的问题。我可以将该字符串完全扩展为日期和 BGPInterface,将其传递到我编写的一个小测试 exe 中,该 exe 获取其标准输入并将其吐回控制台。整个字符串都通过了。
  • 我实际上是指远程设备的终端会话垂直列字符限制。我在网上搜索过;但找不到任何东西。

标签: powershell ssh plink cisco-ios


【解决方案1】:

当您在非全局范围(如脚本或函数范围)中写入变量时,PowerShell 不会修改任何更高级别的同名范围变量。 IOW $Response = 'foo' 将创建 $Response 变量的本地副本并将“foo”分配给它。如果您的意图是修改全局变量 $Response 则将行更改为 $global:Response = ... 您在 $global:Response 中看到的内容是剩余的,可能来自以前的修补。

【讨论】:

  • 谢谢,但不是这样。我只是暂时使用了一个全局变量,以便在脚本运行后在我的命令提示符处快速转储变量的内容(出于演示目的)。在我的原始脚本中,没有定义全局变量。
  • 编辑:我刚刚编辑了这个问题,所以它没有“全局”(以避免任何混淆)
【解决方案2】:

如果我手动输入以下命令,我终于验证了所有远程设备上都发生了相同的行为。如果使用了太多字符,则 get 行会混乱。

我变了:

sho log | include $Date.*LINK-3-UPDOWN.*$BGPInterface

到下面的命令(只删除几个字符);而且,它工作得很好。看起来这是 Cisco IOS CLI 限制。

sho log | include $Date.*LINK-3-UPDO.*$BGPInterface

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2016-08-26
    相关资源
    最近更新 更多