いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

シェルスクリプトの実行ユーザがrootかどうかをチェック (bash, id -u)

概要

以下、よく忘れるので自分用のメモです。

たまにシェルスクリプトの説明とかで、「このスクリプトはrootユーザで実行してください」みたいなものを見ることがあります。(実務では特に)

んで、rootユーザ以外で実行しちゃうとエラーになるか、なんか変な状態になってしまうとかが発生したりする・・・現場ではよくある話かもしれませんw

説明書きにそのように書くのは正しいとしても、せめてroot以外で実行したら駄目な処理をする場合、rootユーザかどうかのチェックくらいは入れておきたいですね。

rootユーザ(superuser account) のユーザIDは常に0

rootユーザのユーザIDは常に 0 なので、それをチェックするのが一番楽です。

以下、サンプル。

#!/usr/bin/env bash

# 
# スクリプトの実行ユーザが root ユーザかどうかをチェックするサンプルです.
#
# REFERENCES:
#   - https://github.com/microsoft/vscode-dev-containers/blob/19adbac72304efc3f7b09970a3bac3c5a68a4c27/containers/javascript-node/.devcontainer/library-scripts/common-debian.sh#L24
#
_exec() {
    # root ユーザのユーザIDは常に0なのを利用してチェックする
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "non-root user"
        exit 1
    fi

    echo -e "root user"
}

_exec

一般ユーザで実行してみると

$ id -u
1000

$ make run
ENTER EXAMPLE NAME: root_user_check

[INPUT ] root_user_check
[TARGET] root_user_check
[SCRIPT] /workspaces/try-shellscript/basic/root_user_check/root_user_check.sh

===== START [/workspaces/try-shellscript/basic/root_user_check/root_user_check.sh] =====
non-root user
===== END   [/workspaces/try-shellscript/basic/root_user_check/root_user_check.sh] =====

DONE

rootユーザで実行してみると

$ sudo su

# id -u
0

$ make run
ENTER EXAMPLE NAME: root_user_check

[INPUT ] root_user_check
[TARGET] root_user_check
[SCRIPT] /workspaces/try-shellscript/basic/root_user_check/root_user_check.sh

===== START [/workspaces/try-shellscript/basic/root_user_check/root_user_check.sh] =====
root user
===== END   [/workspaces/try-shellscript/basic/root_user_check/root_user_check.sh] =====

DONE

ちゃんと判別できていますね。

参考情報

superuser.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com