我想将输入输入到Cisco AnyConnect vpncli.exe(v2.3)的命令行界面,以使其(重新)连接自动化.它不需要用户名或密码作为命令行参数,而是通过命令行界面从用户交互地读取.
问题是输入vpncli.exe的管道似乎不适用于密码.它适用于除密码以外的所有内容.所以这样做不行:
vpncli.exe < input.txt type input.txt | vpncli.exe
应用程序刚刚被卡在要求密码的位置.
以下是用户输入参数的正常(工作)执行的示例:
请注意密码字符如何转换为*.
使用AutoIt或AutoHotKey这样的工具将输入发送到命令提示符窗口起作用,但是笨拙和脆弱(如果工具由于某种原因无法访问命令提示符窗口,则不起作用).
有没有办法使用PowerShell向这种交互式CLI应用程序发送输入?
(或使用任何其他脚本语言或其他一些手段?)
在Windows控制台应用程序中至少有两种方式可以读取输入.
原文链接:https://www.f2er.com/bash/386427.html> ReadConsole:从键盘或重定向读取输入(documentation).
> ReadConsoleInput:只读原始按键(documentation).
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()