【问题标题】:Feeding input to an interactive command line application向交互式命令行应用程序提供输入
【发布时间】:2012-07-13 20:51:33
【问题描述】:

我想将输入提供给 Cisco AnyConnect vpncli.exe (v2.3) 的命令行界面,以自动化其(重新)连接。它不接受用户名和密码作为命令行参数,而是通过命令行界面以交互方式从用户那里读取这些参数。

问题是vpncli.exe 的管道输入似乎不适用于密码。它适用于除密码之外的所有内容。所以做这样的事情是行不通的:

vpncli.exe < input.txt
type input.txt | vpncli.exe

应用程序卡在它要求输入密码的地方。


下面是用户输入参数的正常(工作)执行示例:

注意密码字符如何转换为*


使用 AutoIt 或 AutoHotKey 之类的工具将输入发送到命令提示符窗口是可行的,但笨拙且脆弱(如果工具由于某种原因无法进入命令提示符窗口,则不起作用)。


有没有办法使用 PowerShell 将输入发送到此类交互式 CLI 应用程序?

(或者使用任何其他脚本语言或其他方式?)

【问题讨论】:

标签: winapi shell powershell scripting automation


【解决方案1】:

你需要创建一个普通的文本文件,比如

连接 myvpnhost
我的登录名
我的密码

将其保存为 myfile.dat(例如)然后调用

"%ProgramFiles%\Cisco\Cisco AnyConnect 安全移动客户端\vpncli.exe" -s

【讨论】:

  • 在问题中我说这确实有效。或者你是说-s 标志使它工作?那个标志有什么作用?
  • 是的,-s 标志只是将标准输入 (
  • 如果您不信任我,只需运行 vpncli.exe /? :-)
  • 使用 Cisco AnyConnect 安全移动客户端(版本 3.0.08057),-s 标志不再是一个选项(因此这个答案不起作用),还有其他解决方法吗?
【解决方案2】:

至少有两种方法可以在 Windows 控制台应用程序中读取输入。

vpncli.exe 应用程序使用ReadConsoleInput 来读取密码,这种重定向密码的方式不起作用。不过,您可以使用WriteConsoleInput。我有一个小的 Python 脚本可以做到这一点:

import subprocess
import win32console

ANYCONNECT_BIN = 'c:\\Program Files\\Cisco\\Cisco AnyConnect Secure Mobility Client\\vpncli.exe'

def write_console_input(text):
  stdin = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)
  ir = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
  ir.KeyDown = True
  for ch in text:
    ir.Char = unicode(ch)
    stdin.WriteConsoleInput([ir])

def main():
  proc = subprocess.Popen([ANYCONNECT_BIN,'connect','VPN'],stdin=subprocess.PIPE)
  proc.stdin.write('%s\n%s\n' % ('GROUP', 'USERNAME'))
  write_console_input('%s\n' % 'PASSWORD')
  ret = proc.wait()
  print ret

if __name__ == '__main__':
  main()

【讨论】:

  • 谢谢,很好的信息/参考和例子。尽管如此,我最终还是使用 ControlSend 和 AHK 将击键发送到控制台窗口(即使窗口被最小化等也能正常工作)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2010-10-01
  • 2010-11-28
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多