我对 OpenVPN 使用双因素身份验证,并且使用指令进行操作static-challenge
。
我还想存储我的 VPN 用户名和密码。
我尝试auth-user-password up
按照手册页执行此操作,但是当我这样做时,它没有给我提供静态挑战的机会,因此失败了。
我尝试编写一个 Python 脚本,通过 stdin 将用户名、密码和质询响应传递给 openvpn 进程,但 openvpn 似乎没有收到我发送到 stdin 的任何内容(即使针对我编写的获取使用输入的示例脚本运行相同的代码sys.stdin.readline()
)。下面是代码片段。
openvpn = subprocess.Popen(
['openvpn', '--config', os.path.expanduser('~/.ovpn-config')],
stdin=subprocess.PIPE)
openvpn.communicate('%s\n%s\n%s\n' % (username, password, otp))
对于如何存储用户名和密码并使用静态质询,您有什么想法吗?
谢谢!
答案1
我猜问题在于用户名和密码没有通过标准输入发送!
您应该看一下 python 模块“pexpect”。
答案2
您必须使用伪 tty:
#!/usr/bin/env python
import os
import sys
import pty
import subprocess
K = "GOOGLEAUTHKEY"
OVPN = "client.ovpn"
CHALLENGE = "CHALLENGE"
p = subprocess.Popen(["oathtool", "--totp", "-b", K], stdout=subprocess.PIPE)
code = p.stdout.read().strip()
cp, fd = pty.fork()
if cp == 0:
os.execlp("openvpn", "openvpn", "--config", OVPN)
else:
f = os.fdopen(fd)
challenge = False
while not challenge:
l = os.read(fd, len(CHALLENGE))
challenge = l == CHALLENGE
if not challenge:
f.readline()
os.write(fd, "%s\n" % code)
while True:
try:
print f.readline().strip()
except KeyboardInterrupt:
os.kill(cp, 15)
except IOError:
print "Bye"
sys.exit(0)