今日のシェル芸 :: パスワードを自動生成したい

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

手順書や公開用のブログでよくパスワードの設定を指示する場合があると思います。その時に、 “mysecret” (適宜変更してください。) とかって書くのは手順書的にいまいち格好悪いし、うっかり秘密のパスワードを公開してしまったりというリスクもあります。そんな時に役立ちそうなシェル芸を StackExchange で見つけたので、メモっておきたいと思います。

元ネタはこちら
StackExchange
How to generate a random string?

結論

これ

head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''

head コマンドで /dev/urandom から乱数を取得して、tr コマンドで文字列に変換して head コマンドで必要な文字数を取り出しています。

tr コマンドの “-d” オプションは削除指示で、”-c” オプションと組み合わせると、後ろで指定した文字以外を削除という意味になります。

head コマンドの “-c” オプションは、取り出す量を行数でなくて文字数で指示しています。

最後の echo コマンドは、そのまま出力すると改行が入らないで、コマンドプロンプトとつながって見難くなるのを抑止しています。

/dev/urandom を使うと刺さってしまうのでは?と心配される方もいらっしゃるかと思いますが、今は機構が変わっているのでそんなに心配しなくても大丈夫です。

使い道

例えば mysql や、mariadb のユーザを作成する場合を考えます。

通常手順書的には以下のように書くことが多いと思います。

mysql -u root -e "GRANT ALL ON MYDB.* TO 'myuser'@'localhost' IDENTIFIED BY 'mypassword';"
※ mypassword を置き換えてね

ただこれだと単純にコピペできませんし、うっかりそのままコピペしてセキュリティが低い設定をしてしまう可能性があります。

そこで以下のように書き換えてしまいます。

MYPASS=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)
mysql -u root -e "GRANT ALL ON MYDB.* TO 'myuser'@'localhost' IDENTIFIED BY '${MYPASS}';"
echo $MYPASS
(出力を控えてね)

これであれば、コピペですべて対応できますし、うっかり秘密のパスワードをブログに書いてしまうこともないですし、安全でないパスワードで構築してしまう可能性もずいぶん減ると思います。

応用として sed を使って設定ファイルを書き換えてしまえば、パスワードが全く人目に触れることなく、設定が完了してしまいます。

例えば、パスワードを設定する箇所が “password=MY_PASSWORD_HERE” という行があるsetting という名前の設定ファイルがあるとして、

cp setting setting.org
sed -e "s/MY_PASSWORD_HERE/${MYPASS}/g" < setting.org > setting

とかしてしまえば、パスワードを控える必要すらありません。

ちょっとした応用

今回の例では、生成されるパスワードがアルファベット大文字、小文字、数字だけで構成されてしまいます。それでは弊社のパスワード要件が満たせないよってかたは、tr コマンドに渡す文字集合を変更してみてください。

以下の例では、OWASP Password special Charactersを渡しています。

head /dev/urandom | tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' | head -c 13  ; echo

最後に

今回はちょっとした シェル の小技を紹介させていただきました。まだまだいろんなバリアントがあると思いますが、個人的な趣味に合わせて工夫してみてください。

それでは皆様よい、シェル芸ライフを

投稿者プロフィール

福島 厚
Old soldiers never die,
They simply fade away.


batch

batch

batch

batch

batch

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.