OpenVPNには2要素認証を使用していますが、_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))
_
ユーザー名とパスワードを保存し、静的チャレンジを使用する方法についての考えはありますか?
ありがとう!
問題は、ユーザー名とパスワードが標準入力経由で送信されないことだと思います!
python module "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)