別の関数出力でシェルスクリプトの一意の文字列をどのように更新できますか?

別の関数出力でシェルスクリプトの一意の文字列をどのように更新できますか?

怠惰なので、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送信期待関数の最後の部分を追加します。

関連情報