包含命令行提示符的 Shell 腳本
背景
我對 Linux 非常陌生和新手,所以如果這不是主題,或者我使用了錯誤的術語等,請提前道歉。
我正在編寫一個 shell 腳本,通過從 node.js 項目呼叫 Powershell 在 Ubuntu/WSL 上執行。我將包含
wsl
命令的字元串以及我嘗試執行的 shell 腳本的路徑傳遞給 PowerShell 模組,如下所示新的 PowerShell(“wsl ./lpass.sh”)
問題
shell 腳本能夠完美執行,但是,我有一行程式碼需要在執行時將輸入傳遞給命令提示符。這行程式碼向伺服器發送登錄請求,然後伺服器做出響應,提示使用者輸入密碼。當我只用這一行呼叫腳本時,我已經能夠讓這行程式碼工作,在提示時將使用者輸入傳遞給命令。這就是
lpass.sh
當我讓命令按照我想要的性質工作時文件的樣子。#!/bin/sh echo 'Password' | LPASS_DISABLE_PINENTRY=1 lpass login --force testuser@testing.com
以這種方式配置文件後,我只需從 PowerShell 命令行呼叫腳本即可登錄到我想要的 LastPass 帳戶。使用管道,我的密碼被傳遞並在提升時作為命令提示符的輸入輸入。但是,顯然,我想做的不僅僅是通過 LastPass 的 CLI 登錄帳戶。
我想做的是,登錄 LastPass 帳戶,然後在我登錄後通過 LastPass CLI 執行更多操作。我希望該
lpass.sh
文件包含更多的命令和程式碼,而不僅僅是一行所以…#!/bin/sh echo 'Test' | LPASS_DISABLE_PINENTRY=1 lpass login --force test@testuser.com lpass show -G -x --json poopy | jq '.' > poopy.json
問題是如果我執行如上所示的文件,命令提示符不會在管道之前接受我的輸入,因此不會將我登錄到 LastPass 帳戶。之後的命令似乎工作正常,但是我不確定結果,因為我無法在沒有登錄 LastPass 的情況下執行該命令。
問題
如何編寫 shell 腳本,以便我的第一行在
echo "password" | lpass login
管道之前接受輸入,但其中也包含多行程式碼?是否有某處或某物描述了命令提示符如何與腳本的其餘部分互動/shell 腳本如何執行?我能夠在此處和其他一些地方找到有關 shell 腳本的一些文件,但是我正在努力尋找我遇到的確切問題。或者更好的是,我真正感興趣的是,shell 如何通過腳本與命令提示符進行互動,以及 shell 如何執行/執行/調試導致命令無法通過更多程式碼行正常執行的腳本在它之後。
將您的 lasspass 主密碼嵌入到隨機腳本中通常是一個糟糕的主意,這些腳本可能會錯誤地送出到 github 或作為合法發現過程的一部分發送到其他地方,或者被某些 bloatenschlaag 瀏覽器中執行的 javascript 佔用。考慮到這一點…
根據
lpass(1)
手冊頁,可以在標準輸入中接受密碼:如果 pinentry 程序不可用,或者如果 LPASS_DISABLE_PINENTRY 環境變數設置為 1,則將從標準輸入讀取密碼,並在標準錯誤時顯示提示。
這在實踐中似乎有點挑剔,但最終我能夠得到類似的東西
printf 'Hunter2' | LPASS_DISABLE_PINENTRY=1 lpass login jhqdoe@example.com
從命令行工作。您可能需要檢查退出狀態字(由 shell 破壞到
$?
變數中)以查看該命令是否實際工作並在非零退出時使腳本失敗。另一種選擇是設置
LPASS_ASKPASS
which 應該是產生標準輸出密碼的程序,但這或多或少與上述相同。
lpass
可能會預設執行一個小守護程序;這可能會使事情複雜化。您可以通過將命令導出LPASS_AGENT_DISABLE=1
到lpass
執行該命令的環境來禁用它。或者,用於lpass status
查看是否應輸入密碼:$ lpass status Not logged in. $ echo $? 1
其他密碼程序可能會改為從中讀取,
/dev/tty
在這種情況下,您通常需要expect
與程序互動之類的東西,因為在這種情況下將不使用標準輸入。相關程序可能會或可能不會記錄這一事實。無論如何,完整的 lastpass shell 腳本可能如下所示,僅在必要時登錄。它可以進行更多的錯誤檢查,例如擷取登錄或狀態命令的結果,並在出現問題時顯示資訊,而不是預設隱藏它。
#!/bin/sh lpasslogin() { printf 'Hunter2' | LPASS_DISABLE_PINENTRY=1 lpass login --force test@example.com >/dev/null 2>&1 } lpassup() { lpass status >/dev/null || lpasslogin status=$? if [ $status -ne 0 ]; then printf >&2 "lpass login failed\n" exit $status fi } lpassup # account creation for testing printf "Username: test\nPassword: Hunter2" | lpass add test --non-interactive # and now testing (`jq` might not be doing much here?) #lpass show -G -x --json test | jq . > test.json