怠惰なので、openvpnを自動的に起動する一連の非常に「汚れた」スクリプトを書いています。私が使用している設定ファイルはvpnbook.com/freevpnから入手したものです。
私が使用するパスワードを取得するには:
lynx --dump --nolist vpnbook.com/freevpn | grep -i password | sort -u | cut -b 18,19,20,21,22,23,24
パスワードはウェブサイトから返されます。
次に、Expectスクリプトを使用して自動的にログインします(ユーザー名は常にvpnbookですが、パスワードは曜日によって変わります)。
#!/usr/bin/expect -f
spawn openvpn /vpn/vpnbook-ca1-tcp80.ovpn ### my vpn configuration file ###
expect "*?sername:*"
send -- "vpnbook\r"
expect "*?assword:*"
### This next line sends the password that changes by the week, which I...
###...unfortunately need to update manually (for lack of a better method):
send -- "weekly-password\r"
パスワードを自動的に更新しようとしたときに発生する問題:
1)予想される環境では、lynxを直接呼び出すことはできません。
2)パスワードの変更により、先週の固有のパスワードフレーズを更新されたバージョンに変更する方法がわかりません。
send -- "unique-previous-password\r"
3)lynx関数によって出力された文字列を入力変数として使用して、先週のパスワード(私の予想スクリプトで)を編集する方法がわかりません。
私が「最もスマートな」プログラマーでもなく、最も効率的なプログラマーでもないことは明らかです。しかし、最終的に私の唯一の目標は、単一のコマンドを入力してVPNを完全に初期化することです(前述のように私は怠惰です)。
どんな助けでも大変感謝します。ありがとうございます!
答え1
expect
/スクリプトでは、次のものをtcl
使用できます。
send "$env(PASSWORD)\r"
expect
以下を使用してスクリプトを呼び出します。
PASSWORD=$(elinks -dump...) /path/to/your/expect/script
短い名前を使用できますcut -b18-24
。
答え2
Stéphaneのソリューションは非常に優れていますが、毎回パスワードをダウンロードして解析したくない場合は、次の2段階のプロセスを維持できます。
パスワード検索コマンドを次のように修正してください。
sed -e '$ d' -i .bak f && echo -n "send -- \"" >> f && lynx --dump --nolist vpnbook.com/freevpn | grep -i password | sort -u | cut -b 18-24 >> f && echo "\\r\"" >> f
簡潔さのために予想されるスクリプトファイルを呼び出しますf
。実際には、/path/to/your/expect/script
スクリプトと同じディレクトリに既にない限り、完了する必要があります。
その後、通常どおり期待されるスクリプトを呼び出します。
細分化されている場合、拡張コマンドは次のように機能します。
sed -e '$ d' -i .bak f
最後の行($
)を見つけてf
削除します(d
)。スイッチ-e
に注意してください-i
。一部のプラットフォームでは、スイッチが異なるかサポートされていません。スイッチを使用するときにコマンドを明示的に指定する-e
ことは、その場所でファイルを変更し、拡張のバックアップを保存することを意味します。-i
-i
.bak
&&
前のコマンドが成功した場合は、次のコマンドを実行します。echo -n "send -- \"" >> f
>> f
改行文字()なしでファイル()にsend Expect関数の最初の部分を追加します。-n
lynx...
元のコマンドですが、結果はファイル(>> f
)に追加されます。echo "\\r\"" >> f
送信期待関数の最後の部分を追加します。