通过 plink 将多个命令传递给 Cisco CLI 时出错

Error passing multiple commands to Cisco CLI via plink

我在此批处理文件的较早部分获得了一些帮助,但现在我在处理最终组件时遇到了问题。 我尝试了一些没有成功的事情。我尝试将 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 中找到的命令,我认为这是真正的麻烦。行数各不相同,但它们都是这个特定的命令,只是 MACs.

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

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

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

我有另一个想法,但它 kinda/very 很笨拙。如果有一种方法可以将每个 MAC deauth 命令输出到单独文件夹(out1、out2、out3)中它们自己的文件,并让 BAT 能够 运行 中所有随机生成的文件该文件夹,以便每个文件夹都是一个单独的 plink 会话。

如果我需要 change/add/elaborate 任何事情,请告诉我。提前感谢你们愿意提供的任何帮助。我很感激。

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

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

more Out2.txt > Out2CRLF.txt

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

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

With some servers (particularly Unix systems), you can even put multiple lines in this file and execute more than one command in sequence, or a whole shell script; but this is arguably an abuse, and cannot be expected to work on all servers. In particular, it is known not to work with certain ‘embedded’ servers, such as Cisco routers.


尽管您可能仍然可以向 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

这在没有 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 中的 plink 提取 ASA 上的完整 ACL 列表时遇到了同样的问题。

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

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

这不是一个好的解决方案,但它作为最后的手段起作用了。