仮想化全盛のこの世の中、OSインストール直後の各種設定はなるだけ無人化したい。
そこでFreeBSDでのユーザ設定の無人化について。

pw(8)

pwを使う。
man pwすると画面いっぱいに広がるSYNOPSISにまずのけぞる。
そのくらい、たくさんのことができるpwコマンドであるが、使うのは二つだけ。

pw groupadd
pw useradd

グループ追加とユーザ追加ですな。

pwでのグループ追加

書式は以下の通り

pw groupadd -q -n <グループ名> -g <GID>

-qはエラーメッセージの抑制。
じゃ実際にエラーが発生したらどうすんだ、って話になるが、そこはステータスコードを使う。

グループ:testgをgroup ID:10010で追加するなら、以下の通り。

pw groupadd -q -n testg -g 10010

pwでのユーザ追加

グループ追加に比べ、こちらはちょっと複雑。
書式は以下の通り。

pw useradd -n <ユーザ名> -u <UID> -s <シェル> \
-m -d <ホームディレクトリ> -G <グループ名> \
-c <コメント>

特に-mを除いて説明の必要はないと思う。
-mはホームディレクトリを新規に作る、という意味。

しかしこれだけだとパスワードを訊かれてしまう。

パスワード設定も無人でしたい。

パスワード設定も自動化するには、以下のようにする。

echo -n '<パスワード>' |\
pw useradd -n <ユーザ名> -u <UID> -s <シェル> \
-m -d <ホームディレクトリ> -G <グループ名> \
-c <コメント> \
-h 0

-h 0をオプションとして与えると、pw はパスワード設定を標準入力から受け付けてくれる。
つまり、パスワードをechoし、その標準入力を-h 0オプションを与えたpw useraddにパイプすればよい。

パスワードにtest, uidに10010, シェルに/bin/sh, ホームディレクトリは/home/test, グループ:testに所属するユーザtestを作成するには、以下のように。

echo -n 'test' |\
pw useradd -n test -u 10010 -s /bin/sh \
-m -d /home/test -G test -c 'test user' \
-h 0

いや、でもさあ、パスワード丸見えじゃないか。
そう思ったあなたは正しい。
上記のスクリプトは使うべきでない。

暗号化済みのパスワードを無人で設定するには。

前章で追加した-hオプションを-Hにすれば、pwは暗号化済みのパスワードを受け付けてくれる。
こうしておけば、仮にスクリプトを覗かれたって、パスワードを平文で書いてあるよりははるかに危険度は少ない。

パスワードにtest, uidに10010, シェルに/bin/sh, ホームディレクトリは/home/test, グループ:testに所属するユーザtestを作成するケースを考える。

この記事で触れた方法でパスワードを暗号化する。この例ではsaltは"SALTsalt"。

$ perl -e 'print crypt("test", "\$6\$SALTsalt");'
$6$SALTsalt$gH47I0mRGadJVVlIpeTxVlYw.SjkPOZ7lJoGkqOyhyeUJ7PV5QWuYpIG6D5ggew6RXLpl1eA72TpgX5pGDpr/.

得た文字列をechoしてpwに渡す。※文字列長いので省略してます。

echo -n '<暗号化済みパスワード>' |\
pw useradd -n test -u 10010 -s /bin/sh \
-m -d /home/test -G test -c 'test user' \
-H 0

自分のシステムがどの方法でパスワードを暗号化しているか、確認するのを忘れないこと。
MD5ならまずどのシステムでも大丈夫だが、MD5は今じゃちょっと危ないからね。

以上