通过 Python 连接 CISCO Anyconnect VPN
Connect CISCO Anyconnect VPN via Python
我正在尝试通过 python 功能连接到 CISCO Anyconnect VPN。我已经看到这里给出的方法:
Connect CISCO Anyconnect VPN via bash
但首先我有几个问题,第一个是 Python 的新手,第二个是不愿意使用 any/very-few 除了 [=16= 之外的第三方 modules/libraries ].
在这里,当我 运行:
时,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()
类型错误:无法连接 'str' 和 'file' 对象
我该怎么办?非常感谢。
稍微调整后,我发现了问题并提出了以下解决方案。请注意下面 # 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')
我正在尝试通过 python 功能连接到 CISCO Anyconnect VPN。我已经看到这里给出的方法: Connect CISCO Anyconnect VPN via bash
但首先我有几个问题,第一个是 Python 的新手,第二个是不愿意使用 any/very-few 除了 [=16= 之外的第三方 modules/libraries ].
在这里,当我 运行:
时,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()
类型错误:无法连接 'str' 和 'file' 对象
我该怎么办?非常感谢。
稍微调整后,我发现了问题并提出了以下解决方案。请注意下面 # 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')