Подключите CISCO Anyconnect VPN через Python

Я пытаюсь подключиться к CISCO Anyconnect VPN через функцию python. Я видел приведенные здесь способы: Подключить CISCO Anyconnect VPN через bash

Но сначала у меня есть пара проблем, первая из которых связана с Python, а вторая — нежелание использовать какие-либо/очень немногие сторонние модули/библиотеки, кроме https://github.com/cernekee/stoken.

Здесь stoken дает мне токен RSA SecureID для аутентификации при запуске:

$ stoken tokencode

Мой пароль состоит из 4-значного PIN-кода, скажем, WXYZ, который связан с токеном RSA для ввода кода доступа.

Я придумал следующую однострочную команду bash для подключения, которая пока работает с моей OSX:

'(echo "user.name";echo "WXYZ$(stoken tokencode)"; echo y )> vps.ad ; /opt/cisco/anyconnect/bin/vpn -s connect "vpn.domain" < vps.ad'

Теперь, в моем скрипте Python, я попытался использовать оба модуля os и subprocess, чтобы сделать то же самое, но эффектно потерпел неудачу.

У меня есть несколько доменов VPN и два разных вывода (например, WXYZ), которые я пытаюсь собрать вместе, чтобы воспроизвести приведенную выше команду bash. Теперь функция выглядит так:

def __auth_cisco_vpn__(username, pin, domain):
try:
    token = str(os.popen('stoken tokencode', 'r'))

    pre_prcs = '(echo "' + username + '";echo "' + pin + '$(stoken tokencode)"; ' + 'echo y )> vps.ad ; /opt/cisco/anyconnect/bin/vpn -s connect "' + domain + '" < vps.ad'

    subprocess.Popen(pre_prcs, shell=True, executable="/bin/bash", stdout=subprocess.PIPE,
                                     stderr=subprocess.PIPE).communicate()
    return True

except KeyboardInterrupt:
    return False

Мне удалось получить следующую ошибку, когда я пытаюсь получить токен отдельно, как показано ниже:

pre_prcs = '(echo "'+username+'";echo "'+pin+'$'+token+'"; ' + 'echo y )> vps.ad ; /opt/cisco/anyconnect/bin/vpn -s connect "'+domain+'" < vps.ad'

subprocess.Popen(pre_prcs, shell=True, executable="/bin/bash", stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

TypeError: невозможно объединить объекты «str» и «file»

Что я должен делать? Спасибо заранее.


person katiepy    schedule 09.03.2017    source источник
comment
Я подозреваю, что будет проще изменить openconnect в соответствии с вашими потребностями. Он может подключаться к Cisco AnyConnect, но имеет открытый исходный код.   -  person ephemient    schedule 10.03.2017


Ответы (1)


После небольшой настройки я обнаружил проблему и придумал следующее решение. Обратите внимание на ошибку с кавычками в разделе # Assign cmd ниже:

import subprocess

def __auth_cisco_vpn__(username, pin, domain):

    # Grab Token
    proc = subprocess.Popen(['stoken', 'tokencode'],
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)
    store = list(proc.stdout)
    token = store[0].strip()

    # Assign cmd
    credentials = "printf '" + username + "\\n" + pin + token + "\\ny'"
    vpn_cmd = "/opt/cisco/anyconnect/bin/vpn -s connect '" + domain + "'"
    cmd = credentials + " | " + vpn_cmd

    # Command Execution
    print("Executing Command: \n" + cmd)
    subprocess.Popen(cmd,
                     shell=True,
                     executable="/bin/bash",
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE).communicate()

__auth_cisco_vpn__('user.name', 'WXYZ', 'domain')
person katiepy    schedule 15.03.2017