Windows 批处理脚本:使用 Plink 的 SSH 在输出中显示奇怪的序列

Windows batch scripting: SSH with Plink showing strange sequences in output

我正在编写一些命令行操作脚本,用于从 Palo Alto 5060 防火墙收集和解析特定网络指标。我正在使用 Plink 和 Windows 批处理脚本。

@echo off
"C:\path\to\plink.exe" -ssh user@1.2.3.4 -pw password < "C:\path\to\commands.txt >> "C:\path\to\output.txt"

目前commands.txt的内容比较简单

show interface ethernet1/1

我无法让它工作。我的 output.txt 有以下结果:

Last login: Tue Nov 24 15:43:13 2015 from localhost

show interface ethernet1/1Welcome user.
user@pa5060> show 
[Kuser@pa5060> show interface 
[Kuser@pa5060> show interface ethernet1/1

这不是正确的输出,命令的输入让我感到困惑。有人见过这样的东西吗?如果相关,此设备上有一个登录横幅。

我猜你在 command.txt 末尾少了一个换行符,所以命令没有提交。


至于重复提示和[K顺序:
这仅仅是因为远程端希望您端有一个交互式终端,并发送 ANSI escape sequences 来漂亮地打印输出。

每一行都可能以 CR(回车 return)字符开头,这会导致交互式终端覆盖前一行。但这不起作用,当您将输出重定向到文件时。尽管如果您使用 type output 在终端 (cmd.exe) 上打印文件,您可能只会得到最后一行。

要使 Plink 不启用交互式终端,请使用 -T command-line switch:

"C:\path\to\plink.exe" -ssh user@1.2.3.4 -pw password -T < "C:\path\to\commands.txt >> "C:\path\to\output.txt"

虽然更好的是在 PLink 命令行上指定命令

"C:\path\to\plink.exe" -ssh user@1.2.3.4 -pw password show interface ethernet1/1 >> "C:\path\to\output.txt"

或使用-m switch:

"C:\path\to\plink.exe" -ssh user@1.2.3.4 -pw password -m "C:\path\to\commands.txt >> "C:\path\to\output.txt"

区别在于,这种方式指定的命令是在非交互式终端中自动执行的,主要是在"exec"频道中以更受控的方式执行,然后在"shell"频道中你是重定向输入时使用。因此,您摆脱了 "Last login:" 消息以及命令提示符 (user@pa5060>) 等。