質問: bashでユーザー入力のパスワードをプログラムの標準入力の一部にする最も安全で簡単な方法は何ですか? ユーザーがbashシェルプロンプトでパスワードを入力し、そのパスワードをプログラムのstdinの一部にするための(1)最も安全で(2)最も簡単な方法を探しています。これはstdinがどのように見える必要があるかです:{"username":"myname","password":"<my-password>"}、 どこ <my-password>は、シェルプロンプトに入力されたものです。プログラムstdinを制御できれば、パスワードを安全に要求して適切な場所に配置するようにプログラムを変更できますが、ダウンストリームは標準的な汎用コマンドです。以下を使用するアプローチを検討し、拒否しました。 コマンドラインにパスワードを入力するユーザー:パスワードは画面に表示され、「ps」を介してすべてのユーザーに表示されます 外部プログラムの引数へのシェル変数補間(例:...$password...):パスワードは引き続き「ps」を介してすべてのユーザーに表示されます 環境変数(環境に残っている場合):パスワードはすべての子プロセスに表示されます。診断の一部としてコアダンプまたはダンプ環境変数をダンプする場合、信頼できるプロセスでもパスワードが公開される可能性があります 長期間ファイルに保存されているパスワード、たとえ権限が厳しいファイルでも:ユーザーが誤ってパスワードを公開し、rootユーザーが誤ってパスワードを表示する可能性がある 私は現在の解決策を以下の回答として示しますが、誰かが考え出した場合、より良い回答を喜んで選択します。もっと単純なものがあるべきだと思います。あるいは、誰かが私が見逃したセキュリティの懸念を見ているかもしれません。
回答: お使いのバージョンのreadが-sをサポートしていない場合は、 この答え にあるposix互換の方法を試してください。echo -n "username: "; read uname echo -n "password: "; set +a; stty -echo; read passwd; command <<<"$passwd"; set -a; stty echo; echo passwd= # get rid of passwd possibly only necessary if running outside of a script set +aは、変数の環境への自動「エクスポート」を防止するためのものです。 sttyのmanページを確認してください。利用可能なオプションはたくさんあります。適切なパスワードにはスペースを含めることができるため、<<<"$passwd"が引用されています。 stty echoを有効にした後の最後のechoは、次のコマンド/出力を新しい行で開始することです。