bashでユーザーが入力したパスワードをプログラムの標準入力の一部にする最も安全で簡単な方法は何ですか?

bashでユーザーが入力したパスワードをプログラムの標準入力の一部にする最も安全で簡単な方法は何ですか?

私は(1)ユーザーがbashシェルプロンプトにパスワードを入力し、そのパスワードがプログラムの標準入力の一部になるようにする最も安全で(2)最も簡単な方法を探しています。

これがstdinの外観です:{"username":"myname","password":"<my-password>"}<my-password>シェルプロンプトに入力された内容はどこにありますか?プログラムの標準入力を制御できる場合は、パスワードを安全に入力して所定の位置に置くように変更できますが、ダウンストリームは標準の汎用コマンドです。

私は次の方法を考えて拒否しました。

  • ユーザーはコマンドラインにパスワードを入力します。パスワードは画面に表示され、「ps」を介してすべてのユーザーに表示されます。
  • シェル変数は、外部プログラムのパラメータ(たとえば...$PASSWORD...)に挿入されます。パスワードはまだ「ps」を介してすべてのユーザーに表示されます。
  • 環境変数(環境に残っている場合):パスワードはすべての子プロセスに表示されます。信頼できるプロセスであっても、診断中にコアをダンプしたり環境変数をダンプしたりすると、パスワードが公開される可能性があります。
  • パスワードは、厳格な権限を持つファイルにも長い間ファイルに保存されます。ユーザーは誤ってパスワードを公開し、ルートは誤ってパスワードを表示する可能性があります。

現在の解決策を以下の答えとして残しておきます。しかし、誰かがより良い答えを提案したら、喜んでより良い答えを選択します。もっと簡単なものがあるべきだと思います。あるいは、誰かが私が逃したセキュリティ問題を見つけたかもしれません。

ベストアンサー1

またはbashzsh

unset -v password # make sure it's not exported
set +o allexport  # make sure variables are not automatically exported
IFS= read -rs password < /dev/tty &&
  printf '{"username":"myname","password":"%s"}\n' "$password" | cmd

そうでない場合は、IFS=入力したreadパスワードから前後のスペースが削除されます。

それ以外の場合は、-rバックスラッシュを引用符文字として扱います。

端末からのみデータを読み取ることができることを確認しようとしています。

echo安定して使用できません。bashおよび にはがzsh組み込まれprintfているため、 の出力にコマンドラインは表示されませんps

あなたはbash引用する必要があります$password。そうでなければ分割+グローバル演算子が適用されます。

しかし、その文字列をJSONにエンコードする必要があるため、これはまだ間違っています。たとえば、二重引用符とバックスラッシュは少なくとも問題です。これらの文字のエンコードについて心配する必要があるかもしれません。プログラムにUTF-8文字列が必要ですか?あなたの端末は何を送っていますか?

プロンプト文字列を追加するには、次のようにしますzsh

IFS= read -rs 'password?Please enter a password: '

そしてbash

IFS= read -rsp 'Please enter a password: ' password

おすすめ記事