【问题标题】:Error passing multiple commands to Cisco CLI via plink通过 plink 向 Cisco CLI 传递多个命令时出错
【发布时间】:2015-02-13 16:19:58
【问题描述】:

我在这个批处理文件的前面部分得到了一些帮助,但现在我在处理最终组件时遇到了问题。 我已经尝试了一些没有成功的事情。我尝试将 CRLF 更改为 LF,但什么也没做。我也尝试过用几种方式改写命令,但我仍然没有得到任何结果。以下是我的主要批处理文件。

@echo on

REM delete deauth command file
SET OutFile="C:\temp\Out2.txt"
IF EXIST "%OutFile%" DEL "%OutFile%"

plink -v -ssh *@x.x.x.x -pw PW -m "c:\temp\WirelessDump.txt" > "C:\temp\output.txt"

setlocal
for /f %%a in (C:\temp\output.txt) do >> "Out2.txt" echo wir cli mac-address %%a deauth forced

REM Use commands in out2 to deauth
plink -v -ssh *@x.x.x.x -pw PW -m "c:\temp\Out2.txt"
pause

这句话下面是在Out2 中找到的命令,我认为这给了实际麻烦。行数各不相同,但它们都是具有不同 MAC 的特定命令。

wir cli mac-address xxxx.xxxx.xxxx deauth forced

如果Out2 只有一行,它运行良好,没有问题。但是当有多行时,它会失败并显示错误,指出该行具有无效的自动命令。几乎就像是把它当作一个连续的命令来读取。正如我上面提到的,我从 CRLF 更改为 LF,希望 IOS 会更喜欢它,但失败了。我尝试在命令之间添加额外的行,并且尝试每次从该文件调用登录名。

我希望有一种方法可以定制命令以一次传递所有行,以将其减少到最少的文件。

我有另一个想法,但它有点/非常笨拙。如果有办法将这些 MAC deauth 命令中的每一个输出到单独文件夹(out1、out2、out3)中自己的文件中,并让 BAT 能够运行该文件夹中所有随机生成的文件,这样每个文件都是分离的 plink 会话。

如果我需要更改/添加/详细说明任何内容,请告诉我。提前感谢你们愿意提供帮助的任何事情。我很感激。

编辑: Martin 指出了实际的限制。通过 SSH 接受命令块似乎是对 Cisco 的限制。所以我仍然有同样的问题,我只需要一些帮助来解决这个问题。我在想我上面提到的多文件解决方案可能有一些可能性。但是我太菜鸟了,不知道如何使它起作用。如果我有任何突破,我会更新。感谢您的任何贡献!

【问题讨论】:

标签: batch-file ssh cisco plink


【解决方案1】:

这实际上是 Cisco 的一个已知限制,它不支持 SSH“exec”通道命令中的多个命令。

PuTTY/Plink 手册引用部分3.8.3.6 -m: read a remote command or script from a file

对于某些服务器(尤其是 Unix 系统),您甚至可以在该文件中放置多行并依次执行多个命令或整个 shell 脚本;但这可以说是一种滥用,并且不能期望在所有服务器上都有效。 众所周知,不能与某些“嵌入式”服务器(例如 Cisco 路由器)一起使用。


尽管您可能仍然可以向 Plink 输入提供多个命令:

(
  echo command 1
  echo command 2
  echo command 3
  echo exit
) | plink -v -ssh user@host -pw password > output.txt

或者您可以简单地使用输入文件:

plink -v -ssh user@host -pw password < input.txt > output.txt

【讨论】:

    【解决方案2】:

    这可以在没有 cmd.exe 和使用文件的情况下工作:

     function Invoke-PlinkCommandsIOS { 
         param (
            [Parameter(Mandatory=$true)][string] $Host,
            [Parameter(Mandatory=$true)][System.Management.Automation.PSCredential] $Credential,
            [Parameter(Mandatory=$true)][string] $Commands,
            [Switch] $ConnectOnceToAcceptHostKey = $false
        )
         $PlinkPath="$PSScriptRoot\plink.exe"
        $commands | & "$PSScriptRoot\plink.exe" -ssh -2 -l $Credential.GetNetworkCredential().username -pw "$($Credential.GetNetworkCredential().password)" $Host -batch
     } 
    

    用法:不要忘记你的出口和终端长度为0,否则它会挂起

    PS C:\> $Command = "terminal lenght 0
    >> show running-config
    >> exit
    >> "
    >>
    PS C:\> Invoke-PlinkCommandsIOS -Host ace-dc1 -Credential $cred -Commands $Command
    

    ....

    【讨论】:

    • 非常感谢您的回复。不幸的是,我以前从未将 powershell 用于任何复杂的事情。我应该怎么做才能适应我的环境?一般来说,我是脚本的新手。我想我可以将$cred 换成我的用户/密码?还有$PlinkPath="$PSScriptRoot\plink.exe",我的环境变量中有plink,所以我可以输入plink,我还需要指定路径吗?对不起,新手,但感谢您帮助我理解。
    【解决方案3】:

    听起来您的文件“Out2.txt”在行尾只有 LF。将其转换为 CRLF 的简单方法是使用 MORE 命令并将输出重定向到新文件,然后使用新文件。

    more Out2.txt > Out2CRLF.txt
    

    【讨论】:

    • 两种方法我都试过了。它最后有默认的 CRLF。我在搜索中读到了一条建议,让我尝试使用 LF 结尾,但它对过程没有影响。
    【解决方案4】:

    我在尝试通过 powershell 中的 plink 提取 ASA 上的 ACL 的完整列表时遇到了同样的问题。

    基本上,由于文档中提到的滥用问题:https://the.earth.li/~sgtatham/putty/0.72/htmldoc/Chapter3.html#using-cmdline-m,我在提取 ACL 时得到了不一致的结果。有时我会得到 0,有时只有 1 或 2,有时我会得到所有这些。 (我个人的成功率大约是五分之一)。

    因为我偶尔会成功,所以我使用了一个 while 循环来捕获不成功的尝试并重试。请务必在 while 循环上设置一些时间,以防止它过多地向 ssh 连接发送垃圾邮件。

    这不是一个好的解决方案,但它是最后的手段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多