【问题标题】:CMD Fileless equivalent of < redirectionCMD Fileless 相当于 < 重定向
【发布时间】:2019-05-12 18:26:58
【问题描述】:

我有一批包装 AnyConnect 移动客户端 CLI (vpncli.exe) 并要求用户名和密码稍后将它们处理到 vpncli。

简化代码:

set /p user_id=Username:
set /p pwd=Password:
echo %user_id%> c:\temp\configvpn.txt
echo %pwd%>> c:\temp\configvpn.txt

set install_dir="C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client"

%install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s < c:\temp\configvpn.txt

net use h: \\fileserver\sharename /user:domain\%user_id% %pwd%

最后一行是我们这样做的原因:不提示用户密码两次(第一次用于连接 VPN,第二次用于映射网络驱动器)

出于安全原因,我正在改进脚本以不将密码写入磁盘。 我需要一个无文件等效的“

我试过了:

(
    @echo %user_id%
    @echo %pwd% 
) | %install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s

目前还没有成功。输出是这个循环:

  >> Please enter your username and password.
Group: VPN-TESTGROUP

Username: [myUsername] Password:
  >> Login failed.
Group: VPN-TESTGROUP

Username: [myUsername] Password:
  >> Login failed.

(无限重复)

有没有办法做到这一点?

【问题讨论】:

  • 你知道你@echo %pwd%&lt;space&gt;吗?
  • 将你的命令输出发送到一个文件,即(echo ...; echo ...) &gt; a.txt 然后diff 你的configvpn.txta.txt 看看有什么结果。
  • 两个echos 也可能存在竞争条件(至少在我的测试中是这样)。如果您始终提供用户名而不提供密码,请尝试将timeout /t 1 &gt;nul 放在两个命令之间。
  • @Stephan 我不知道。现在已修复,但问题仍然存在。
  • Stephan 和 Mark Setchell 表示管道块内存在echo 的问题,请参阅SO: Windows cmd echo / pipe is adding extra space at the end - how to trim it?

标签: windows batch-file command-line cmd


【解决方案1】:

正如您已经发现的那样,问题在于管道内的尾随空格,正如您在jeb's answer 中看到的那样,要摆脱尾随空格需要特殊处理。

管道导致混淆的一个方面是管道命令不是在批处理文件上下文中使用批处理语法规则执行,而是在命令行上下文中执行,并且在子 cmd 实例中使用命令行语法规则。

需要彻底了解 CMD/Batch 管道的机制,才能以这种方式构建和维护有效的解决方案,对于稍微复杂的管道块来说,这不是一项简单的任务。

这是一种替代方法,它可以像在普通批处理代码中一样灵活地管道任何复杂的命令块。

@echo off
if "%~1"=="/LPipe" goto :/LPipe
if "%~1"=="/RPipe" goto :/RPipe

set /p user_id=Username:
set /p pwd=Password:

"%~f0" /LPipe | "%~f0" /RPipe
exit /b


:/LPipe
REM This will be executed inside a pipe but in batch context

REM Enable delayed expansion to be able to send any special characters
setlocal EnableDelayedExpansion

REM It's easy to take care of trailing spaces, no special hacks needed.
echo !user_id!
echo !pwd!
goto :EOF


:/RPipe
REM This will be executed inside a pipe but in batch context

%install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s
goto :EOF

【讨论】:

  • 你好。我仍然得到循环。我使用的是 4.5.02033 版本。
  • @Tom,我手头没有要测试的 vpncli,但是两个 echos 之间的延迟应该可以解决。将&gt;nul timeout /t 1 放在echo !user_id! 之后和echo !pwd! 之前的新行中,看看它是否能解决问题。还要确保echo 命令中没有任何尾随空格,因为它们在文本编辑器中是不可见的,但会成为输出的一部分(如果有的话)。
  • 感谢您的快速回答。我让它工作了!问题是在用户名和密码之前,我必须选择要连接的组。所以我只是添加了 echo !group!按照你的模板。它有效,不需要超时。再次感谢@sst
【解决方案2】:

这可能是管道块的问题,因为每个命令的末尾都添加了空格。

此代码避免了空格,应该可以解决您的问题

(SET LF=^
%=empty=%
)

(
    echo %user_id%%%LF%%rem.
    echo %pwd%%%LF%%rem.
) |  %install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s

但您应该在 user_id 或密码中不包含任何特殊字符的情况下对其进行测试!

【讨论】:

  • 你太棒了。它现在正在工作。还有一件事:我的测试密码没有特殊字符,但用户密码可能有。由于我的技能本身不会将该块重写为特殊字符安全,您能否建议对代码进行任何更改,以便为这种情况提供(某种)强大的处理?
  • @Filipe 你应该使用answer of sst,它看起来很复杂,但是通过延迟扩展可以很容易地解决特殊字符的问题。 echo !pwd! 解决问题字符的问题
猜你喜欢
  • 1970-01-01
  • 2016-10-02
  • 2010-09-14
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多