[Archlinux 4.18.9]
VPN経由でクラスターに接続するための簡単なエイリアスを作成しました。
alias clusvpn='sudo /usr/bin/openvpn --config client.ovpn'
これには特定の/etc/sudoers
エントリが含まれているため、cmdの発行時に許可されたユーザーからsudoパスワードが要求されることはありません。
これにより、2つの入力要求が発生します。1つは離れたVPNサーバーに登録されているユーザーの名前用で、もう1つはユーザーのパスワード用です。手作業で、cliから、すべてが正常に機能します。問題ない。
ただし、チャネルが開いたら、つまりユーザーが名前とパスワードを入力すると、VPNセッションをバックグラウンドに自動的に配置したいと思います。理想的には、エイリアスを使用してcmdが発行されると同時にその事実を示したいと思います。ただし、発行するsudo /usr/bin/openvpn --config client.ovpn &
と、ユーザーはユーザー名とパスワードを入力できなくなります。
パスワードとユーザー名を含むファイルに頼らずにこれを行う方法はありますか?
あなたが話している資格情報は--auth-user-pass
、ではなく、--askpass
で渡すことができることを理解しているので、--daemon
役に立ちません。
使えると思いますexpect
。考えられる解決策のスケッチ:
spawn sudo /usr/bin/openvpn --config client.ovpn
プログラムを実行します。expect "Username: "
または同様のもの(openvpn
印刷内容によっては、現時点では確認できません)でプロンプトを待ちます。次のようなコードを使用します。
send_user "Username: "
expect_user -re "(.*)\n"
ユーザーからユーザー名を取得します。
send "$expect_out(1,string)\n"
それをプログラムに渡します。
stty -echo
役に立つかもしれません。fork
しdisconnect
、プログラムをバックグラウンドに置きます。あなたを助けるかもしれないマニュアルの例があります。「無効なパスワード、再試行」などの応答をカバーするロジックを実装することもできると思います。
これは私のまだテストされていないコードです:
#!/usr/bin/expect
log_user 0
set timeout -1
spawn sudo /usr/bin/openvpn --config client.ovpn
expect "*sername*"
send_user "Username: "
expect_user -re "(.*)\n"
send "$expect_out(1,string)\n"
expect "*assword*"
stty -echo
send_user "Password: "
expect_user -re "(.*)\n"
send "$expect_out(1,string)\n"
stty echo
send_user "\n"
if {[fork]!=0} exit
disconnect
expect eof
唯一のテストはDebianで行われ、別のコンソールでspawn nc …
別のnc
リスニングに接続されていました。プロンプトと回答を正常に送信した後、元のメッセージはexpect
終了しました。私はシェルプロンプトにいましたが、2つのnc
-sはまだ接続されており、生成されたものはバックグラウンドで実行されていました。同じことが起こるはずですがopenvpn
、私はこれをテストしたことがありませんopenvpn
。
ここからそれを取ってください(ヒント:行をコメントアウトするlog_user 0
ことはテストに役立ちます)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加