使用静态质询时如何存储 OpenVPN 密码

使用静态质询时如何存储 OpenVPN 密码

我对 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)

相关内容