[小ネタ][bash]シェルスクリプトでユーザーを一撃作成する


どうもこんばんは。 @nullpopopo です。またおっさんになってしまいました。以下の要件でLinuxのローカルユーザーを作成したくなったので、シェルスクリプト一撃でできるようにしてみました。

  1. OSインストール直後の真っさらな状態(root以外にログインできるユーザーはいない)
  2. UID GIDともに1000番から連番で作成。ただし、GIDは1000番固定。
  3. グループ名は「webmaster」
  4. パスワードはランダムな8文字で、 /root 直下にパスワードのメモを残しておく(もちろん後で消す)

ユーザー名は配列「USERS」の中にベタ書きしています。GIDの開始番号やグループ名は変数をよしなに編集してください。

まずはソースコードから。

#!/bin/bash
#set -uex
LANG=C
LC_ALL=C

USERS=(
hamada
popopo
nullpopopo
)

USERS_GID=1000
START_UID=$(expr ${USERS_GID} - 1)
GROUPNAME=webmaster

PW_LENGTH=8

# グループ作成
groupadd -g                \
  $(expr ${START_UID} + 1) \
  ${GROUPNAME}

# ユーザー作成
echo ${USERS[@]}                           | \
  sed -e "s/[[:space:]]/\n/g"              | \
  cat -n                                   | \
  awk '{
    print "useradd -u",
    $1 + '${START_UID}',
    "-g '${USERS_GID}' -s /bin/bash",
    $2
  }'                                       | \
  sh

# すべてのユーザーにランダムなパスワードを付与する
for USERS_LIST in ${USERS[@]}
do
  PW=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c ${PW_LENGTH} )
  echo ${USERS_LIST}:${PW} | tee ${USERS_LIST}.txt | chpasswd
done

最初にできるユーザー(配列「USERS」に格納した先頭のユーザー)のUIDとGIDが同じになるように、かつ以降に作成されるユーザーのUIDのみを1つずつカウントアップさせるウマい方法はないものか、と思案していたのですが、ユーザー作成処理で cat -n している(1から数えられる)ことを逆手にとって、最初の変数でワザとUIDから1引いた数を自動的に変数「START_UID」へ格納するようにしています。

ユーザー作成をbashのfor文で回さずにawkを使っているのは、私自身のawk力を上げたい、というそれだけの理由でawkの四則計算を使っていますw

しかし、これでは最初にグループを作成するときに不都合なので、groupaddするときにまた1を足して元に戻しているという、バッドノウハウ of バッドノウハウっぷり・・・。これ、自分1人でメンテするならまだしも、人にメンテナンスしてもらうには不親切なコードですね・・・。

それではコマンド実行結果を見てみましょう。

[root@node129 ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023


[root@node129 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
(略)

[root@node129 ~]# ./test.sh

[root@node129 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
(略)
hamada:x:1000:1000::/home/hamada:/bin/bash
popopo:x:1001:1000::/home/popopo:/bin/bash
nullpopopo:x:1002:1000::/home/nullpopopo:/bin/bash

[root@node129 ~]# cat hamada.txt
hamada:Xhuw6GII

[root@node129 ~]# exit

以上、小ネタでした。。。