Shell-Script
如何使用單獨函式的輸出更新 shell 腳本中的唯一字元串?
由於我的懶惰,為了自動啟動我的 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"
- 我不確定如何使用 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
附加發送期望函式的最後一部分。