どうもこんばんは。 @nullpopopo です。またおっさんになってしまいました。以下の要件でLinuxのローカルユーザーを作成したくなったので、シェルスクリプト一撃でできるようにしてみました。
- OSインストール直後の真っさらな状態(root以外にログインできるユーザーはいない)
- UID GIDともに1000番から連番で作成。ただし、GIDは1000番固定。
- グループ名は「webmaster」
- パスワードはランダムな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
以上、小ネタでした。。。
[amazonjs asin="4774181889" locale="JP" title="Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門 (Software Design plus)"]