質問: エコーを使用して機密データをchpasswdに渡すことは安全ですか? chpasswdを使用して、いくつかのユーザーアカウントパスワードを一括設定しようとしています。パスワードはランダムに生成され、stdoutに出力されます(書き留めるか、パスワードストアに配置する必要があります)。また、chpasswdに渡されます。単純に、私はこれをこのようにします{ echo student1:$(head /dev/urandom | tr -dc a-za-z0-9 | head -c 13 ; echo '') echo student2:$(head /dev/urandom | tr -dc a-za-z0-9 | head -c 13 ; echo '') } | tee >(chpasswd) ただし、引数は通常ps -auxで他のユーザーに表示されるため、echoに新しいパスワードをコマンドライン引数として渡すことを心配しています(echo行がpsに表示されることはありませんでした)。返されたパスワードの前に値を付加し、それをchpasswdに渡す別の方法はありますか?
回答: echoはシェルの組み込みなのでプロセステーブルに表示されないため、コードは安全である必要があります。これが代替ソリューションです:#!/bin/bash n=20 paste -d : <( seq -f 'student%.0f' 1 "$n" ) \ <( tr -cd 'a-za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) | tee secret.txt | chpasswd これにより、コマンドのコマンドラインでパスワードを渡すことなく、学生の名前とパスワード、それらのnが作成されます。pasteユーティリティは、いくつかのファイルを列として結合し、それらの間に区切り文字を挿入します。ここでは、:を区切り文字として使用し、2つの「ファイル」(プロセス置換)を指定します。 1つ目は、20の学生のユーザー名を作成するseqコマンドの出力を含み、2つ目は、長さ13の20個のランダムな文字列を作成するパイプラインの出力を含みます。ユーザー名が既に生成されているファイルがある場合:#!/bin/bash n=$(wc -l <usernames.txt) paste -d : usernames.txt \ <( tr -cd 'a-za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) | tee secret.txt | chpasswd これらはファイルにパスワードとユーザー名を保存しますsecret.txt端末で生成されたパスワードを表示する代わりに。