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

时间:2015-02-13 16:19:58

标签: batch-file ssh cisco 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中找到的命令,我认为它给出了实际的麻烦。线条数量各不相同,但只是使用不同的MAC,它们都是这个特殊的命令。

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

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

我希望有一种方法可以定制命令,一次一个地传递所有行,以便将其保持在最小的文件中。

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

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

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

4 个答案:

答案 0 :(得分:1)

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

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

  

对于某些服务器(特别是Unix系统),您甚至可以在此文件中放置多行,并按顺序执行多个命令,或者整个shell脚本;但这可以说是一种滥用,并且无法在所有服务器上运行。 特别是,已知与某些“嵌入式”服务器(例如Cisco路由器)配合使用。

答案 1 :(得分:1)

这不使用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

...

答案 2 :(得分:0)

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

more Out2.txt > Out2CRLF.txt

答案 3 :(得分:0)

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

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

由于我偶尔会成功,所以我使用了while循环来捕获失败的尝试并重试。只需确保在while循环上放置一些时间,以防止它过多地向ssh连接发送垃圾邮件。

这不是一个好的解决方案,但它是不得已的方法。