【问题标题】:Passing values to intermediate (runtime) input prompts of Windows command将值传递给 Windows 命令的中间(运行时)输入提示
【发布时间】:2012-08-30 18:08:49
【问题描述】:

我有一个windows exe,它显示一些版权信息,连接到服务器,然后提示输入用户名和密码。

所以每当我运行它时,我都必须等待提示输入用户名和密码。 我一般在命令开始显示版权信息后先输入用户名、密码,但这是一种粗略的方式。

有没有更好的方法在批处理文件中将参数传递给 windows 命令的输入提示符,这样我就可以避免总是输入它们?

附:在 Linux 中,我们使用

linux_command <<delimiter
inputparamvalue1
inputparamvalue2
delimiter

linux_command 将运行并在第一个输入提示时读取 inputparamvalue1,在下一个输入提示时读取 inputparamvalue2

作为对 James 的回应,感谢您提供有关安全性的建议。我会处理的。

我尝试实施您的解决方案,但没有奏效。

这些是我的文件。请看看你是否得到任何提示。

vpn.bat

@ echo off    
"C:\Program Files (x86)\Cisco\Cisco AnyConnect VPN Client\vpncli.exe" connect "mycompanyvpnsite.com"

login.txt

myusername  
mypassword

startvpn.bat

@ECHO OFF  
CALL vpn.bat < login.txt  
ECHO I'm back!

结果

D:\>startvpn.bat  
Cisco AnyConnect VPN Client (version 2.5.6005) .  

Copyright (c) 2004 - 2010 Cisco Systems, Inc.  
All Rights Reserved.  


  >> state: Disconnected  
  >> notice: Ready to connect.  
  >> registered with local VPN subsystem.  
  >> state: Disconnected  
  >> notice: Ready to connect.  
VPN>   >> contacting host (mycompanyvpnsite.com) for login information...  
  >> notice: Contacting mycompanyvpnsite.com.  
VPN>  
  >> Please enter your username and password.  

Username: [myusername] Password:  

它显示的用户名 myusername 是从我以前的手动登录中缓存的。因此,这次运行似乎没有从 login.txt 中获取任何值。
如果我在没有任何参数的情况下单独执行了我的 vpn.bat,我会得到这样的提示

VPN>  
  >> Please enter your username and password.  

Username: [myusername] <i press enter to take the cached value>  
Password: ******** <i enter password and press enter>  

它连接起来。

vpn 客户端没有权限在命令行上指定密码,这就是我尝试这种方式的原因。

【问题讨论】:

标签: windows command-line batch-file


【解决方案1】:

我有一个有效的代码!它与 James K 的相似,但有一些漏洞被敲定。我想再次重申,这是相当不安全的,因为它会将您的密码暴露在未加密的设置中。话虽这么说:

'Anyconnect login script
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")

' rather clunky way of selecting the correct directory - open to suggestion
oShell.Run "cmd /k cd %PROGRAMFILES(x86)%\Cisco & cd Cisco* & vpncli.exe connect MYCOMPANYVPN.COM"

' sleep of 100 neccessary or else it opens multiple cmd windows
Wscript.sleep 100

' activate correct window
oShell.AppActivate "Connect"

' optional ipsec Identifier used for multiple VPN profiles on the same server
'(if you don't have one, just comment this out)
oShell.SendKeys "IPSECID{ENTER}"

' Send Username and Password to Active Window.
oShell.SendKeys "USERNAME{ENTER}"
oShell.SendKeys "USERPASSSWORD{ENTER}"

oShell.SendKeys "exit{ENTER}"

祝你好运!

【讨论】:

    【解决方案2】:

    将您的用户名和密码保存在一个文件中以自动执行登录过程是一个非常糟糕的主意,并且会使需要用户名和密码提供的任何安全措施无效,因为任何获得对您计算机的电子或物理访问权限的人都可以访问您的纯文本用户名和密码。

    也就是说,在 DOS / Windows 命令提示符中,您将需要一个包含您的用户名和密码的额外文件,如下所示:

    LOGIN.TXT

    MyUserName
    MyPassword
    

    然后像这样将该文件通过管道传输到您的命令中:

    @ECHO OFF
    CALL Command_Or_Batch < login.txt
    ECHO I'm back!
    

    这就像您在控制台并输入 MyUserName[ENTER] MyPassword[ENTER] 一样。

    login.txt 只是一个普通的文本文件,不需要.txt 扩展名,或者根本不需要任何扩展名。

    CALL 语句仅在启动另一个批处理文件时才需要,如果您希望它在完成后继续在原始调用批处理文件中执行。在调用可执行文件(批处理文件以外的任何内容)时,使用CALL 没有区别。


    编辑:根据您的 cmets,我相信您需要这样做才能使其正常工作:

    @ echo off    
    "C:\Program Files (x86)\Cisco\Cisco AnyConnect VPN Client\vpncli.exe" connect "mycompanyvpnsite.com" < login.txt
    

    在这种情况下,您重定向到您的vpncli.exe,但我相信这会产生副作用,使vpncli.exe 接受来自login.txt 的输入,而不是来自键盘的输入直到vpncli.exe 退出。这意味着您需要自动化(存储在 login.txt 中)您通常需要输入的所有内容。这应该不是问题,除非您稍后需要手动与 vpncli.exe 交互。


    编辑:由于vpncli.exe 似乎在读取任何击键之前清除缓冲区,我建议可能使用 VBS 可能会让您到达您想去的地方。

    VPN.VBS
    'VBScript 示例 设置 WshShell = WScript.CreateObject("WScript.Shell")

    WshShell.Run "C:\Program Files (x86)\Cisco\Cisco AnyConnect VPN Client\vpncli.exe connect mycompanyvpnsite.com"
    
    ' You need to know the name of the window, It should be in the upper left corner
    ' I'm guessing that it will be the filename of the executible
    WshShell.AppActivate "vpncli.exe"
    
    ' Send Username and Password to Active Window.
    WshShell.SendKeys "MyUserName{ENTER}"
    WshShell.SendKeys "MyPassword{ENTER}"
    

    但我不能确定。虽然我只是在批处理文件和 VBS 脚本之间来回切换,但我在测试时遇到了问题。

    虽然我知道您是否将 WshShell.RunWshShell.AppActivate 替换为以下两行...

    WshShell.Run "%windir%\notepad.exe"
    WshShell.AppActivate "Notepad"
    

    ...记事本将打开,将出现以下两行:

    MyUserName
    MyPassword
    

    如果这对您不起作用,我正在考虑完全删除此答案,因为它只包含无效的建议。

    【讨论】:

    • 请检查我在下面发布的 cmets 作为答案。评论标记不足以显示我的代码,所以我不得不使用答案选项。
    • @ChinniKrishna - 我将您的后续内容编辑到问题本身,这是它真正属于的地方。不过,您可能需要清理它以适应您的其余问题。
    • 感谢布拉德没有投反对票。我会听从你的建议。
    • James,我尝试将 login.txt 直接传递给 vpncli,但结果是一样的。当提示输入密码时,似乎 vpncli 正在执行类似“清除输入缓冲区”的操作。在尝试将两行 - 1. ENTER 和 2. y - 在 login.txt 中后,我怀疑这一点。 (在连接之前,vpncli 期望在密码后的条款横幅中使用“y”)。结果是 - 它可能需要第 1 行作为用户名,这使它使用缓存的用户名,在密码提示符处停止,我手动输入密码 + ENTER,然后它从 logn.txt 中获取“y”并连接。
    • James,login.txt 中的换行符是否重要?我在 Notepad++ 中创建它并在使不可打印字符可见时,我将其视为 myusername{CR}{LF}mypassword{CR}{LF}。我单独尝试了所有与 CR、LF 的组合以及两者。结果是一样的。
    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多