Я использую двухфакторную аутентификацию для 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))
Есть какие-нибудь мысли о том, как сохранить имя пользователя и пароль и использовать статический вызов?
Спасибо!
Я предполагаю, что проблема, что имя пользователя и пароль не отправляются через stdin!
необходимо смотреть на модуль Python "pexpect".
Необходимо использовать псевдо 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)