Batch file 通过plink向Cisco CLI传递多个命令时出错

Batch file 通过plink向Cisco CLI传递多个命令时出错,batch-file,ssh,cisco,plink,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

我在这个批处理文件的前面部分得到了一些帮助,但是现在我在最后一个组件上遇到了问题。 我试过几件事都没有成功。我试着把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命令中的每一个都输出到saperate文件夹(out1、out2、out3)中自己的文件中,并使BAT能够运行该文件夹中所有随机生成的文件,以便每个文件都是一个单独的plink会话

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


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

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

more Out2.txt > Out2CRLF.txt

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

引用腻子/扣环手册的章节:

对于某些服务器(特别是Unix系统),您甚至可以在该文件中放入多行代码,并按顺序执行多个命令,或者执行整个shell脚本;但这可以说是一种滥用,不能指望在所有服务器上都能正常工作特别是,众所周知,它不能与某些“嵌入式”服务器一起工作,如Cisco路由器。


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

(
  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
plink-v-sshuser@host-pw passwordoutput.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的完整列表时遇到了相同的问题

本质上,由于文档中提到的滥用问题,我在提取ACL时得到了不一致的结果。有时我会得到0,有时只有1或2,有时我会得到全部。(我个人的成功率约为五分之一)

因为我偶尔会成功,所以我使用了一个while循环来捕获不成功的尝试并重试。只需确保在while循环上设置一些时间,以防止它对ssh连接进行过多的垃圾邮件处理


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

我两种方法都试过了。它的末尾有默认的CRLF。我在搜索中读到一条建议,这条建议让我尝试了LF结尾,但这对过程没有影响。非常感谢您的回复。不幸的是,我以前从未使用过powershell处理任何复杂的事情。我应该做些什么来适应我的环境?一般来说,我是个脚本新手。我想我可以用
$cred
交换我的用户/pw?还有
$PlinkPath=“$PSScriptRoot\plink.exe”
我的环境变量中有plink,所以我可以只键入
plink
,我还需要指定路径吗?对不起,我太生疏了,但是谢谢你帮我理解。一个类似的问题:。