Shell-Script

如何使用單獨函式的輸出更新 shell 腳本中的唯一字元串?

  • June 14, 2017

由於我的懶惰,為了自動啟動我的 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)我不能直接從expect環境呼叫lynx。

2)由於密碼更改,我不確定如何將上週的唯一密碼片語替換為以下更新版本:

send -- "unique-previous-password\r" 
  1. 我不確定如何使用 lynx 函式的字元串輸出作為輸入變數來編輯前一周的密碼(位於我的期望腳本中)。

很明顯,我不是“最聰明的”程序員(也不是最有效率的)。然而,歸根結底,我唯一的目標是通過鍵入一個命令來完全初始化我的 vpn(正如我之前提到的,我很懶)。

任何幫助將不勝感激,謝謝!

在您的expect/tcl腳本中,您可以使用:

send "$env(PASSWORD)\r"

並使用以下命令呼叫您的expect腳本:

PASSWORD=$(elinks -dump...) /path/to/your/expect/script

請注意,您可以使用cut -b18-24簡稱。

Stéphane 的解決方案非常優雅,但如果您不想每次都下載和解析密碼,您可以保留兩步過程,如下所示:

將您的密碼檢索命令修改為:

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) 中,不帶換行符 ( )。-n
  • lynx...您的原始命令,除了將結果附加到文件 ( >> f) 之外。
  • echo "\\r\"" >> f附加發送期望函式的最後一部分。

引用自:https://unix.stackexchange.com/questions/371000