在 Windows 批处理文件中将管道输入 Plink 添加额外的换行符
Piping input into Plink in Windows batch file adds extra line feeds
我正在尝试在 Windows 10 Pro 中将批处理文件写入 运行,它将使用 Plink 与远程服务器建立 SSH 会话并执行一些命令。一切都运行良好,除了出于某种原因,我输入的每个 ECHO
命令都有额外的换行符。通常情况下,这不是问题,直到我 运行ning 的命令需要一些特定的用户反馈,即按 Y
确认操作。由于它在测试 STSTest
命令之后和接收 Y
字符之前收到额外的换行符,因此它会抛出错误。
这是我的批处理脚本:
set PATH=C:\Program Files\PuTTY;%PATH%
set TestNum=%1
(
TIMEOUT /t 1 > nul
ECHO cd /usr/bin/core/test
ECHO rm STS_*.txt
ECHO rm STS_T1_Test%TestNum%.txt
ECHO ./STSTest --T 2 --i %TestNum%
TIMEOUT /t 1 > nul
ECHO Y
TIMEOUT /t 1 > nul
ECHO exit
) | plink -ssh 192.168.1.20 -l root -pw ***
有没有人知道如何消除额外的换行,以便在输入 STSTest
命令后以正确的顺序输入 Y
?
这里有一个更简单的例子来说明我在抗争什么。如果我定义这个简单的批处理文件:
(
TIMEOUT /t 1 > nul
ECHO cd /
ECHO cd usr
ECHO cd bin
ECHO cd core
ECHO cd test
TIMEOUT /t 1 > nul
ECHO exit
) | plink -ssh 192.168.1.20 -l root -pw ***
命令 window 的结果如下所示:
Last login: Wed Jul 29 23:53:30 2020 from 192.168.1.7
root@core-A:~# cd /
root@core-A:/#
root@core-A:/# cd usr
root@core-A:/usr#
root@core-A:/usr# cd bin
root@core-A:/usr/bin#
root@core-A:/usr/bin# cd core
root@core-A:/usr/bin/core#
root@core-A:/usr/bin/core# cd test
root@core-A:/usr/bin/core/test#
root@core-A:/usr/bin/core/test# exit
我在每个 ECHO
命令后得到一个额外的换行符。
批处理文件echo
使用Windows行尾(回车return+换行)。
将 newline hack 与无行结束 hack 相结合:
@echo off
REM don't remove blank lines below
set NLM=^
set NL=^^^%NLM%%NLM%^%NLM%%NLM%
(
<nul set /P=foo%NL%
<nul set /P=foo%NL%bar%NL%
) > test.txt
和test.txt变为(十六进制输出)
66 6F 6F 0A 66 6F 6F 0A 62 61 72 0A foo.foo.bar.
当您在其命令行上没有任何命令的情况下执行 plink
时,plink
会启动一个 interactive 终端会话。这有很多不需要的副作用。包括你面对的那些。
添加-T
switch to plink
command line以避免:
(
...
) | plink -T -ssh 192.168.1.20 -l root -pw ***
另一种选择是在服务器端执行所有操作并在 plink
命令行上指定完整命令(在这种情况下,您还将 ):
plink -ssh 192.168.1.20 -l root -pw *** -batch "cd /usr/bin/core/test && rm STS_*.txt && rm STS_T1_Test%TestNum%.txt && (echo Y | ./STSTest --T 2 --i %TestNum%)"
或者这两种方法的某种组合。
类似问题:
- Script via Plink in .bat behaves differently
我正在尝试在 Windows 10 Pro 中将批处理文件写入 运行,它将使用 Plink 与远程服务器建立 SSH 会话并执行一些命令。一切都运行良好,除了出于某种原因,我输入的每个 ECHO
命令都有额外的换行符。通常情况下,这不是问题,直到我 运行ning 的命令需要一些特定的用户反馈,即按 Y
确认操作。由于它在测试 STSTest
命令之后和接收 Y
字符之前收到额外的换行符,因此它会抛出错误。
这是我的批处理脚本:
set PATH=C:\Program Files\PuTTY;%PATH%
set TestNum=%1
(
TIMEOUT /t 1 > nul
ECHO cd /usr/bin/core/test
ECHO rm STS_*.txt
ECHO rm STS_T1_Test%TestNum%.txt
ECHO ./STSTest --T 2 --i %TestNum%
TIMEOUT /t 1 > nul
ECHO Y
TIMEOUT /t 1 > nul
ECHO exit
) | plink -ssh 192.168.1.20 -l root -pw ***
有没有人知道如何消除额外的换行,以便在输入 STSTest
命令后以正确的顺序输入 Y
?
这里有一个更简单的例子来说明我在抗争什么。如果我定义这个简单的批处理文件:
(
TIMEOUT /t 1 > nul
ECHO cd /
ECHO cd usr
ECHO cd bin
ECHO cd core
ECHO cd test
TIMEOUT /t 1 > nul
ECHO exit
) | plink -ssh 192.168.1.20 -l root -pw ***
命令 window 的结果如下所示:
Last login: Wed Jul 29 23:53:30 2020 from 192.168.1.7
root@core-A:~# cd /
root@core-A:/#
root@core-A:/# cd usr
root@core-A:/usr#
root@core-A:/usr# cd bin
root@core-A:/usr/bin#
root@core-A:/usr/bin# cd core
root@core-A:/usr/bin/core#
root@core-A:/usr/bin/core# cd test
root@core-A:/usr/bin/core/test#
root@core-A:/usr/bin/core/test# exit
我在每个 ECHO
命令后得到一个额外的换行符。
批处理文件echo
使用Windows行尾(回车return+换行)。
将 newline hack 与无行结束 hack 相结合:
@echo off
REM don't remove blank lines below
set NLM=^
set NL=^^^%NLM%%NLM%^%NLM%%NLM%
(
<nul set /P=foo%NL%
<nul set /P=foo%NL%bar%NL%
) > test.txt
和test.txt变为(十六进制输出)
66 6F 6F 0A 66 6F 6F 0A 62 61 72 0A foo.foo.bar.
当您在其命令行上没有任何命令的情况下执行 plink
时,plink
会启动一个 interactive 终端会话。这有很多不需要的副作用。包括你面对的那些。
添加-T
switch to plink
command line以避免:
(
...
) | plink -T -ssh 192.168.1.20 -l root -pw ***
另一种选择是在服务器端执行所有操作并在 plink
命令行上指定完整命令(在这种情况下,您还将
plink -ssh 192.168.1.20 -l root -pw *** -batch "cd /usr/bin/core/test && rm STS_*.txt && rm STS_T1_Test%TestNum%.txt && (echo Y | ./STSTest --T 2 --i %TestNum%)"
或者这两种方法的某种组合。
类似问题:
- Script via Plink in .bat behaves differently