15

vpncli.exeCisco AnyConnect (v2.3)の(再)接続を自動化するために、コマンドラインインターフェイスに入力を送りたいのですが。コマンドライン引数としてユーザー名やパスワードを使用しませんが、コマンドラインインターフェイスを介してユーザーからインタラクティブに読み取ります。

問題は、へのパイプ入力がvpncli.exeパスワードに対して機能していないように見えることです。パスワード以外のすべてで機能します。したがって、このようなことは機能しません。

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

アプリケーションは、パスワードを要求する場所でスタックします。


以下は、ユーザーがパラメーターを入力する通常の(動作中の)実行の例です。

vpncli.exeの実行例

パスワード文字がどのようにに変換されるかに注意してください*


AutoItやAutoHotKeyなどのツールを使用して入力をコマンドプロンプトウィンドウに送信することはできますが、不器用で壊れやすいです(ツールが何らかの理由でコマンドプロンプトウィンドウに到達できない場合は機能しません)。


PowerShellを使用してそのようなインタラクティブなCLIアプリケーションに入力を送信する方法はありますか?

(または、他のスクリプト言語または他の手段を使用していますか?)

4

2 に答える 2

11

次のような通常のテキストファイルを作成する必要があります


myvpnhostmyloginnamemypasswordに接続し
ます

(たとえば)myfile.datとして保存してから、

"%ProgramFiles%\ Cisco \CiscoAnyConnectセキュアモビリティクライアント\vpncli.exe"-s <myfile.dat

于 2015-01-20T14:55:28.500 に答える
8

Windowsコンソールアプリケーションで入力を読み取るには、少なくとも2つの方法があります。

  • ReadConsole:キーボードまたはリダイレクトのいずれかから入力を読み取ります(ドキュメント)。
  • ReadConsoleInput:生のキーストロークのみを読み取ります(ドキュメント)。

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()
于 2012-08-03T07:20:35.130 に答える