Qta*_*tax 14 shell powershell scripting winapi automation
我想将输入馈送到Cisco AnyConnect vpncli.exe(v2.3)的命令行界面,以自动化(重新)连接.它不使用用户名或密码作为命令行参数,而是通过命令行界面从用户以交互方式读取它们.
问题是管道输入vpncli.exe似乎不适用于密码.它适用于除密码之外的所有内容.所以做这样的事情不起作用:
vpncli.exe < input.txt
type input.txt | vpncli.exe
Run Code Online (Sandbox Code Playgroud)
应用程序只是卡在要求输入密码的位置.
以下是用户输入参数的正常(工作)执行示例:

注意密码字符如何转换为*.
使用AutoIt或AutoHotKey等工具将输入发送到命令提示符窗口可以正常工作,但是笨拙且易碎(如果工具由于某种原因无法进入命令提示符窗口,则无效).
有没有办法使用PowerShell向这样的交互式CLI应用程序发送输入?
(或使用任何其他脚本语言或其他方式?)
你需要创建一个通常的文本文件,如
连接myvpnhost
myloginname
mypassword
将其保存为myfile.dat(例如),然后调用
"%ProgramFiles%\ Cisco\Cisco AnyConnect安全移动客户端\ vpncli.exe"-s <myfile.dat
在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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7761 次 |
| 最近记录: |