加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

winapi – 将输入输入到交互式命令行应用程序

发布时间:2020-12-15 18:48:58 所属栏目:安全 来源:网络整理
导读:我想将输入输入到Cisco AnyConnect vpncli.exe(v2.3)的命令行界面,以使其(重新)连接自动化.它不需要用户名或密码作为命令行参数,而是通过命令行界面从用户交互地读取. 问题是输入vpncli.exe的管道似乎不适用于密码.它适用于除密码以外的所有内容.所以这样做
我想将输入输入到Cisco AnyConnect vpncli.exe(v2.3)的命令行界面,以使其(重新)连接自动化.它不需要用户名或密码作为命令行参数,而是通过命令行界面从用户交互地读取.

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

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

应用程序刚刚被卡在要求密码的位置.

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

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

使用AutoIt或AutoHotKey这样的工具将输入发送到命令提示符窗口起作用,但是笨拙和脆弱(如果工具由于某种原因无法访问命令提示符窗口,则不起作用).

有没有办法使用PowerShell向这种交互式CLI应用程序发送输入?

(或使用任何其他脚本语言或其他一些手段?)

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

> ReadConsole:从键盘或重定向读取输入(documentation).
> ReadConsoleInput:只读原始按键(documentation).

vpncli.exe应用程序使用ReadConsoleInput来读取密码,这就是重定向密码不起作用.但是,您可以使用WriteConsoleInput.我有一个很小的Python脚本:

import subprocess
import win32console

ANYCONNECT_BIN = 'c:Program FilesCiscoCisco AnyConnect Secure Mobility Clientvpncli.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('%sn%sn' % ('GROUP','USERNAME'))
  write_console_input('%sn' % 'PASSWORD')
  ret = proc.wait()
  print ret

if __name__ == '__main__':
  main()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读