Как сохранить пароль 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))                  

Есть какие-нибудь мысли о том, как сохранить имя пользователя и пароль и использовать статический вызов?

Спасибо!

3
задан 1 April 2015 в 04:54

2 ответа

Я предполагаю, что проблема, что имя пользователя и пароль не отправляются через stdin!

необходимо смотреть на модуль Python "pexpect".

3
ответ дан 1 April 2015 в 14:54

Необходимо использовать псевдо 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)
0
ответ дан 3 August 2019 в 21:23

Другие вопросы по тегам:

Похожие вопросы: