通过 Python 连接 CISCO Anyconnect ***

Posted

技术标签:

【中文标题】通过 Python 连接 CISCO Anyconnect ***【英文标题】:Connect CISCO Anyconnect *** via Python 【发布时间】:2017-07-31 00:33:33 【问题描述】:

我正在尝试通过 python 函数连接到 CISCO Anyconnect ***。我已经看到这里给出的方法: Connect CISCO Anyconnect *** 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/*** -s connect "***.domain" < vps.ad'

现在,在我的 python 脚本中,我尝试同时使用 ossubprocess 模块来做同样的事情,但失败了。

我有几个 *** 域和两个不同的引脚(如 WXYZ),我试图将它们放在一起以复制上述 bash 命令。该函数现在看起来像这样:

def __auth_cisco_***__(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/*** -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/*** -s connect "'+domain+'" < vps.ad'

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

TypeError: 无法连接 'str' 和 'file' 对象

我该怎么办?非常感谢。

【问题讨论】:

我怀疑修改openconnect 以满足您的需要会更容易。它可以连接到 Cisco AnyConnect,但它是开源的。 【参考方案1】:

经过一番调整,我发现了问题并提出了以下解决方案。请注意下面 #Assign cmd 部分中引用的错误:

import subprocess

def __auth_cisco_***__(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'"
    ***_cmd = "/opt/cisco/anyconnect/bin/*** -s connect '" + domain + "'"
    cmd = credentials + " | " + ***_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_***__('user.name', 'WXYZ', 'domain')

【讨论】:

以上是关于通过 Python 连接 CISCO Anyconnect ***的主要内容,如果未能解决你的问题,请参考以下文章

通过 bash 连接 CISCO Anyconnect ***

cisco怎么无法使用

linuxCentos_8 安装cisco_yang-explorer(详细过程)

通过 Cisco IPSec 连接时,应用程序无法解析内部 DNS 条目

通过Cisco ASA inspection拦截Teamviewer

linux 下连接 Cisco AnyConnect