バッチ処理を使用して一部のユーザーアカウントパスワードを設定しようとしています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)
ただし、新しいパスワードをコマンドライン引数として渡すのは心配ですecho
。引数は通常、他のユーザーに表示されるためですps -aux
(ただし、echo
どの行も表示されませんがps
)。
返されたパスワードの前に値を追加してから渡す他の方法はありますかchpasswd
?
ベストアンサー1
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つの「ファイル」(手続き型置換)を提供します。最初にはseq
20の学生ユーザー名を生成するコマンドの出力が含まれ、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
生成されたパスワードを端末に表示するのではなく、パスワードとユーザー名をファイルに保存します。