通过Python连接CISCO Anyconnect VPN

时间:2017-03-09 20:57:12

标签: python macos unix vpn cisco

我正在尝试通过python函数连接到CISCO Anyconnect VPN。我看过这里给出的方法: Connect CISCO Anyconnect VPN via bash

但首先我遇到了一些问题,第一个是Python的新手,第二个是不愿意使用https://github.com/cernekee/stoken之外的任何/非常少的第三方模块/库。

此处, stoken 在运行时为我提供了RSA SecureID令牌进行身份验证:

$ stoken tokencode

我的密码由一个4位数的引脚组成,例如 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:无法连接&#39; str&#39;和&#39;文件&#39;对象

我该怎么办?非常感谢提前。

1 个答案:

答案 0 :(得分: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')