【问题标题】:Multiple commands using Plink and batch file for Cisco switch使用 Plink 和批处理文件的多个命令用于 Cisco 交换机
【发布时间】:2020-01-25 05:00:45
【问题描述】:

我目前正在尝试编写一个脚本来更改 200 多台 Cisco 交换机的位置 (snmp)。

我的问题是我不能一次运行多个命令。我制作了一个批处理文件,它自动连接到交换机并读取列出命令的 .txt 文件。但无论我做什么,我得到的最好结果是只执行了第一个命令。

批处理文件:

cmd.exe /c echo n | "Filepath(plink)" -ssh Switch Hostname -l Username -pw "Password" -m "txt File"

txt 文件:

conf t
snmp-server location test
end
wr
exit

我已经尝试过 txt 文件中的其他分隔符,例如 ; | 等。 但似乎没有任何效果。

【问题讨论】:

    标签: batch-file ssh putty 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 路由器)一起使用。


    尽管实际上,您的命令可能不是独立的顶级 shell 命令。我猜snmp-server(和其他)是conf t子命令,不是吗?因此,即使 Cisco 确实支持“exec”通道上的多个命令,您的代码也无法运行。

    详情见How to type commands in PuTTY by creating batch file?

    您需要执行conf t,然后将其子命令提供给其标准输入。

    一种方法是这样的:

    (
        echo snmp-server location test
        echo end
        echo wr
        echo exit
    ) | plink -ssh hostname -l username -pw password conf t
    

    【讨论】:

    • 感谢您的分析器,它工作得更好,但我仍然只能一次执行一个命令。有没有办法运行多个命令?
    • 这很模糊。什么“一个命令”?一个顶级命令或一个子命令或conf t?我知道思科,所以我实际上不懂你的命令。
    【解决方案2】:

    如果上述 Cisco 限制不影响此语法:

    SET /P USERNAME=Enter remote Username:
    SET "psCommand=powershell -Command "$pword = read-host 'Enter remote Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"" for /f "usebackq delims=" %%p in (`%psCommand%`) do set PASSWORD=%%p
    plink -t -pw %PASSWORD% %USERNAME%@Hostname "COMMAND1; COMMAND2; COMMAND3; ETC"
    

    如果上述思科限制确实影响了上述语法:

    SET /P USERNAME=Enter remote Username:
    SET "psCommand=powershell -Command "$pword = read-host 'Enter remote Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"" for /f "usebackq delims=" %%p in (`%psCommand%`) do set PASSWORD=%%p
    plink -t -pw %PASSWORD% %USERNAME%@Hostname "COMMAND1"
    plink -t -pw %PASSWORD% %USERNAME%@Hostname "COMMAND2"
    plink -t -pw %PASSWORD% %USERNAME%@Hostname "COMMAND3"
    plink -t -pw %PASSWORD% %USERNAME%@Hostname "Etc"
    

    野蛮,是的,但我认为思科应该为此感谢 ;)(这是未经测试的,因为我没有可戳的 cisco 设备,但理论上应该是合理的)

    【讨论】:

    • 只执行一次Plink时(第一个例子),不需要这么复杂的代码来提示输入密码。只需让 Plink 自行提示即可。 + 在一台主机上执行多个命令时,您可以使用我的答案中的语法。同样,您不需要复杂的密码提示代码。而且您不会对服务器进行 n 次身份验证。此外,如前所述,OP 只有 一个 顶级命令。其他的是子命令。因此,您的示例都不适用于 OP(无论是否思科)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2015-09-29
    • 2019-12-11
    • 2015-05-03
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多