シェルスクリプト 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を信頼できないプログラムの実行や信頼できないデータの処理に使用すること」は推奨されません.「あくまで,サービスには専用のユーザーアカウントを持たせるべき」というルールを忘れないようにしましょう.