J'utilise l'authentification à deux facteurs pour OpenVPN, et je le fais en utilisant la directive static-challenge
.
Je souhaite également stocker mon nom d'utilisateur et mon mot de passe VPN.
J'ai essayé de le faire en utilisant auth-user-password up
par la page de manuel, mais quand je le fais, cela ne me donne pas l'occasion d'offrir un défi statique, donc cela échoue.
J'ai essayé d'écrire un script python qui transmettrait un nom d'utilisateur, un mot de passe et une réponse de défi via stdin au processus openvpn, mais openvpn ne semble pas recevoir les éléments que j'envoie à stdin le même code par rapport à un exemple de script que j'ai écrit et qui est entré avec sys.stdin.readline()
(travaillé). Un extrait est ci-dessous.
openvpn = subprocess.Popen(
['openvpn', '--config', os.path.expanduser('~/.ovpn-config')],
stdin=subprocess.PIPE)
openvpn.communicate('%s\n%s\n%s\n' % (username, password, otp))
Avez-vous des idées sur la manière de stocker le nom d'utilisateur et le mot de passe et d'utiliser un défi statique?
Merci!
Je suppose que le problème est que le nom d'utilisateur et le mot de passe ne sont pas envoyés via stdin!
Vous devriez jeter un oeil au module python "pexpect".
Vous devez utiliser un pseudo 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)