Вопрос по winapi, powershell, scripting, shell, automation – Подача ввода в интерактивное приложение командной строки

14

Я хотел бы передать входные данные в интерфейс командной строки для Cisco AnyConnectvpncli.exe (v2.3) для автоматизации его (пере) подключения. Он не принимает имя пользователя и пароль в качестве аргументов командной строки, но читает их в интерактивном режиме от пользователя через интерфейс командной строки.

Проблема в том, что трубопроводные входы вvpncli.exe похоже, что пароль не работает. Это работает для всего, кроме пароля. Так что подобные вещи не работают:

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

Приложение просто застревает там, где запрашивает пароль.


Ниже приведен пример нормального (рабочего) выполнения, когда пользователь вводит параметры:

Example vpncli.exe run

Обратите внимание, как символы пароля преобразуются в*.


Использование таких инструментов, как AutoIt или AutoHotKey для отправки входных данных в окно командной строки, работает, но является неуклюжим и хрупким (не работает, если инструмент по какой-то причине не может попасть в окно командной строки).


Есть ли способ отправить входные данные в такое интерактивное приложение CLI, используя PowerShell?

(Или используя какой-либо другой язык сценариев или другие средства?)

Пытатьсяwasp.codeplex.com Попробуйте отправить нажатия клавиш в окне консоли. x0n
@AngshumanAgarwal, к сожалению, нет, это другая версия VPN-клиента. Qtax

Ваш Ответ

2   ответа
9

подключить myvpnhost
myloginname
мой пароль

сохраните его как myfile.dat (например) и затем вызовите

& quot;% ProgramFiles% \ Cisco \ Cisco AnyConnect Secure Mobility Client \ vpncli.exe & quot; -s & lt; myfile.dat

если вы мне не доверяете, просто запустите vpncli.exe /? :-)
Да, флаг -s просто расширяет стандартный ввод (& lt;) на консоли. у меня идеально работает около года
В вопросе я заявил, что именно это делаетnot Работа. Или ты говоришь, что-s флаг заставляет это работать? Что делает этот флаг? Qtax
Используя Cisco AnyConnect Secure Mobility Client (версия 3.0.08057),-s флаг больше не является опцией (таким образом, этот ответ не работает), есть ли другие обходные пути?
Это работает в версии 4.2.02075
8

и Windows.

ReadConsole: reads input either from keyboard or redirection (documentation). ReadConsoleInput: reads only raw keystrokes (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()
Спасибо, хорошая информация / ссылка и пример. Альто я в конечном итоге использовалControlSend с помощью AHK для отправки нажатий клавиш в окно консоли (что прекрасно работает, даже если окно свернуто и т. д.). Qtax

Похожие вопросы