コマンドラインプロンプトを含むシェルスクリプト

コマンドラインプロンプトを含むシェルスクリプト

背景

私は初めてLinuxに触れたので、トピックから抜け出すか、間違った用語を使用している場合は事前に謝罪します。など

node.jsプロジェクトでPowershellを呼び出してUbuntu / WSLで実行するシェルスクリプトを作成しています。wsl以下のように、PowerShellモジュールで実行するシェルスクリプトへのパスとコマンドを含む文字列を渡します。

新しいPowerShell( "wsl ./lpass.sh")

質問

シェルスクリプトは完全に実行されますが、コード行があります。必要実行時にコマンドプロンプトに入力を渡します。このコード行はログイン要求をサーバーに送信し、サーバーはユーザーにパスワードの入力を求められます。このコード行だけを使用してスクリプトを呼び出すときにメッセージが表示された場合は、コマンドにユーザー入力を渡すことで、このコード行を正しく機能させることができました。これがlpass.sh私が望む方法で動作するようにコマンドを受け取ったときのファイルの外観です。

#!/bin/sh
echo 'Password' | LPASS_DISABLE_PINENTRY=1 lpass login --force [email protected]

このようにファイルを設定したら、PowerShellコマンドラインからスクリプトを呼び出して目的のLastPassアカウントにログインできます。パイプを使用すると、パスワードが渡され、特権の昇格時にコマンドプロンプトへの入力として入力されます。しかし、私は明らかにLastPassのCLIを介して自分のアカウントにログインする以上のことをしたいと思います。

私ができることを望むのは、私のLastPassアカウントにログインしてからログインした後、LastPass CLIを介してより多くのことを行うことです。lpass.shファイルに1行以上のコマンドとコードを含めたいと思います。

#!/bin/sh
echo 'Test' | LPASS_DISABLE_PINENTRY=1 lpass login --force [email protected]
lpass show -G -x --json poopy | jq '.' > poopy.json 

問題は、上記のファイルを実行すると、コマンドプロンプトがパイプする前に私の入力を受け付けないため、私のLastPassアカウントにログインしないことです。それ以降のコマンドは正常に動作しているようですが、LastPassにログインしないとコマンドを実行できないため、結果を確信できません。

質問

echo "password" | lpass login最初の行がパイプの前の入力を許可しながら、複数行のコードも含めるようにシェルスクリプトをどのように記述しますか?コマンドプロンプトが残りのスクリプトと対話する方法/シェルスクリプトの実行方法を説明するどこかありますか?シェルスクリプトに関するドキュメントが見つかりましたここそして他の場所でもいくつかの問題がありますが、私が経験している正確な問題を見つけるのに苦労しています。あるいは、より良いことは、コマンドプロンプトがスクリプトを介してシェルと対話する方法と、より多くのコード行があるとコマンドが正しく実行されないようにするスクリプトをシェルが実行/実行/デバッグする方法です。

ベストアンサー1

誤ってgithubに送信したり、法的調査プロセスの一部として他の場所に送信したり、一部のbloatenschlaagブラウザで実行されているJavaScriptによってキャプチャされる可能性のある任意のスクリプトにlasspassマスターパスワードを含めることは、一般的に悪い考えです。これを念頭に置いて...

lpass(1)マニュアルページによると、標準入力ではパスワードが許可されています。

pinentry プログラムが使用できない場合、または LPASS_DISABLE_PINENTRY 環境変数が 1 に設定されている場合、標準入力からパスワードが読み取られ、標準エラーにプロンプ​​トが表示されます。

実際には少しトリッキーに見えますが、結局は次のようなものが得られました。

printf 'Hunter2' |
LPASS_DISABLE_PINENTRY=1 lpass login [email protected]

コマンドラインで作業してください。終了ステータスワード(殻に刺され変数として$?)コマンドが実際に機能していることを確認し、ゼロ以外の終了時にスクリプトが失敗するようにします。

別のオプションは、標準出力用のパスワードを生成する必要があるプログラムを設定することですLPASS_ASKPASS。しかし、これは上記とほぼ同じです。

lpassデフォルトでは、小さなデーモンを実行することが可能であり、これは状況が複雑になる可能性があります。LPASS_AGENT_DISABLE=1コマンドが実行されている環境にエクスポートして無効にすることができます。または、次のようにパスワードを入力する必要があるかどうかを確認してください。lpasslpass status

$ lpass status
Not logged in.
$ echo $?
1

他の暗号化プログラムはそれを読み取ることができます。この場合、標準入力は使用されないため、/dev/tty通常はプログラムや同様のものと対話する必要があります。expect関連手順では、この事実を記録することも、記録しないこともあります。

とにかく、完全なLastpassシェルスクリプトは次のようになり、必要に応じてログインします。ログインまたはステータスコマンドの結果をキャプチャし、問題が発生したときにデフォルトで情報を隠すことなく表示するなど、より多くのエラーチェックを実行できます。

#!/bin/sh

lpasslogin() {
   printf 'Hunter2' |
   LPASS_DISABLE_PINENTRY=1 lpass login --force [email protected] >/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

おすすめ記事