Shell-Script

包含命令行提示符的 Shell 腳本

  • August 30, 2022

背景

我對 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_ASKPASSwhich 應該是產生標準輸出密碼的程序,但這或多或少與上述相同。

lpass可能會預設執行一個小守護程序;這可能會使事情複雜化。您可以通過將命令導出 LPASS_AGENT_DISABLE=1lpass執行該命令的環境來禁用它。或者,用於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

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