How to check root user in POSIX Shell script
シェルスクリプトなどで現在のユーザーがルートユーザー(root権限,管理者権限,スーパーユーザー,super user)であるかを判別する方法を記す。
例えば,システムやデバイスの操作を行いたい時には,sudo
やsu
コマンドによりルート権限を取得してからコマンドを実行する。これをシェルスクリプトで実装するには,スクリプト内で現在のユーザーがルートユーザーかどうかを判定して,ルートユーザーでなければ処理を中断させるのが一つの方法だ。そこで,現在のユーザーがルートユーザーであるかを判別する方法が必要となる。
結論を書くと,以下のPOSIX準拠の構文により実現できる。
if [ $(id -u) = 0 ]; then
echo "I am root user: $(id -nu)."
fi
root権限ではuser ID(UID)が0であることがPOSIXで保証されていることを利用している。このことは,WikipediaのUser identifierのページで言及されている。引用元のPOSIXのgetpwuidコマンドのページを確認すると,以下のとおりに確かにroot権限ではUIDは0となると明記されている。
UIDの取得にはPOSIX準拠コマンドであるid -u
により取得できる。ユーザー名の取得は-n
(name)オプションを一緒につければ取得できる。
ネットの情報だと,他にもUID変数やEUID変数,whoamiコマンドを使ったり,ルートユーザー名がrootであることを利用した判別を行っている。
参考:
しかし,これらの変数,コマンド,名前はPOSIXで未定義なので,他の環境での動作が保証できない。そのため,特に他の理由がなければ,[ $(id -u) = 0 ]
により判別すべきだろう。