Linuxシステム上のユーザー一覧を条件に応じて表示する

shell
Linux
Author

Ryo Nakagami

Published

2025-01-10

Modified

2025-07-24

シェルスクリプト ls-users

🎯 スクリプトの目的

/etc/passwd ファイルを読み取り,以下のユーザーを表示する:

  • すべてのユーザー
  • システムユーザー(UID < 1000)
  • humanユーザー(UID >= 1000)

デフォルトでは humanユーザー を表示させる.

シェルスクリプト本体

#!/bin/bash

print_help() {
    echo "Usage: $0 [-a|-s|-h]"
    echo "Options:"
    echo "  -a    Show all users"
    echo "  -s    Show only system users"
    echo "  -h    Show only human users"
    echo "  -?    Show this help message"
    exit 1
}

# Default to human users if no option is provided
MODE="human"

while getopts "ash?" opt; do
    case $opt in
        a) MODE="all";;
        s) MODE="system";;
        h) MODE="human";;
        ?) print_help;;
    esac
done

# Print header
printf "%-20s %-6s %-6s\n" "Username" "UID" "GID"

case $MODE in
    "all")
        awk -F: '{ printf "%-20s %-6s %-6s\n", $1, $3, $4 }' /etc/passwd
        ;;
    "system")
        awk -F: '$3 < 1000 { printf "%-20s %-6s %-6s\n", $1, $3, $4 }' /etc/passwd
        ;;
    "human")
        awk -F: '$3 >= 1000 && $3 < 65534 { printf "%-20s %-6s %-6s\n", $1, $3, $4 }' /etc/passwd
        ;;
esac

スクリプト解説

オプションの処理

while getopts "ash?" opt; do
    case $opt in
        a) MODE="all";;
        s) MODE="system";;
        h) MODE="human";;
        ?) print_help;;
    esac
done
  • getopts を使って、コマンドラインオプションに応じて処理分岐
  • MODE という変数に条件を記録し,optionに応じた処理は後段で実装
option 処理内容
-a 全ユーザー表示
-s システムユーザーのみ表示(UID < 1000)
-h humanユーザーのみ表示
-? ヘルプを表示,status codeは exit 1

ヘッダー出力

printf "%-20s %-6s %-6s\n" "Username" "UID" "GID"
  • 整形されたカラム見出しを出力
  • %-20sは文字列(s)を左寄せで20文字分の幅で表示
書式指定子 意味
%-20s 左寄せで20文字幅の文字列(Username列)
%-6s 左寄せで6文字幅の文字列(UID列)
%-6s 左寄せで6文字幅の文字列(GID列)

ユーサー一覧の取得

case $MODE in
    "all")
        awk -F: '{ printf "%-20s %-6s %-6s\n", $1, $3, $4 }' /etc/passwd
        ;;
    "system")
        awk -F: '$3 < 1000 { printf "%-20s %-6s %-6s\n", $1, $3, $4 }' /etc/passwd
        ;;
    "human")
        awk -F: '$3 >= 1000 && $3 < 65534 { printf "%-20s %-6s %-6s\n", $1, $3, $4 }' /etc/passwd
        ;;
esac
command 動作説明
awk -F: :区切りで /etc/passwd を分割
'$3 >= 1000 && $3 < 65534 { printf ...}' UID が 1000以上65534未満を対象にフィルター
$1 /etc/passwdにおけるusernameカラム
$3 /etc/passwdにおけるUIDカラム
$4 /etc/passwdにおけるGIDカラム

/etc/passwdファイル

Definition 1 /etc/passwdファイル

  • Linux においてユーザーアカウント情報を管理するためのテキストファイル

基本フォーマット

ユーザー名:パスワード:UID:GID:コメント:ホームディレクトリ:ログインシェル

実際に確認してみると

% cat /etc/passwd
kirby:x:1001:1001:Hoshino Kirby:/home/kirby:/bin/bash

第2フィールドは多くの場合 x という表記になっています.実際のハッシュは /etc/shadow に保存されています.

LinuxにおけるUserとGroup

Linuxにおけるuser区分

ユーザー区分 説明
スーパーユーザー システム唯一の特権ユーザー,すべてのアクセス制御を無視することができる. ユーザー名:root, UID:0 と決まっている
システムユーザー 各種サーバープログラムやシステムプログラムの実行に利用されるユーザー. UIDは主に1~99の範囲で割り当てられる
一般ユーザー システムの一般利用者 ユーザーIDは1000以降が割り当てられる(初めてのユーザーなら1000)
Note
  • root以外のuid1000未満のアカウントはデーモンやディレクトリの所有者として利用するシステムアカウントとして用意されている
  • 100未満のUIDについてシステムによって静的に割り当てられるべきであり,アプリケーションによって作成されるべきではない範囲
  • 100 から 499 は,システム管理者やインストール後のスクリプトが useradd を使用して動的に割り当てるために予約された領域

nobodyとは誰か?

Definition 2 nobodyユーザー

  • nobodyに対して,一般的にはUID 65534が割り当てられている
  • 65535は16bit符号なし整数で表すことのできる一番大きな数字(FFFFFF)
  • NFS(Network File System)サーバーがクライアントから提供されたUIDやGIDを信頼できない場合,またはroot-squashオプションが使用されている場合に使用される
  • 基本的にはNFS用に用意されたユーザー

注意点として,ネットワークを通じてコンピューター間でファイルを共有するNFS用のユーザーであってその他の目的で使用されることは想定されていません.「nobodyを信頼できないプログラムの実行や信頼できないデータの処理に使用すること」は推奨されません.「あくまで,サービスには専用のユーザーアカウントを持たせるべき」というルールを忘れないようにしましょう.