ユーザー ID とグループ ID を表示する id コマンドのメモ。
ユーザー ID とグループ ID を表示する id コマンドの使い方のメモ。
このメモは ubuntu 20.10 の Docker コンテナ上の id コマンドを使っている。
$ docker container run --rm -it ubuntu:20.10 /bin/bash
id コマンドのバージョン。
$ id --version id (GNU coreutils) 8.32 Copyright (C) 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Arnold Robbins and David MacKenzie.
id コマンドの使い方
id コマンドはユーザー ID とグループ ID を表示するコマンド。
自分は普段そんなに使わなくて使うときになって使い方を調べたりすることがたまにあるので使い方をメモしておく。
--help オプション: ヘルプ
--help
オプションを指定すると id コマンドの使い方を表示する……んだけど man id
が使えないときにしか使わない
$ id --help Usage: id [OPTION]... [USER]... Print user and group information for each specified USER, or (when USER omitted) for the current user. -a ignore, for compatibility with other versions -Z, --context print only the security context of the process -g, --group print only the effective group ID -G, --groups print all group IDs -n, --name print a name instead of a number, for -ugG -r, --real print the real ID instead of the effective ID, with -ugG -u, --user print only the effective user ID -z, --zero delimit entries with NUL characters, not whitespace; not permitted in default format --help display this help and exit --version output version information and exit Without any OPTION, print some useful set of identified information. GNU coreutils online help: <https://www.gnu.org/software/coreutils/> Report any translation bugs to <https://translationproject.org/team/> Full documentation <https://www.gnu.org/software/coreutils/id> or available locally via: info '(coreutils) id invocation'
オプションなし
id コマンドはオプションなしで実行すると id コマンドを実行したユーザーのユーザー ID、ユーザーの名前、ユーザーが所属するすべてのグループ ID とグループの名前を表示する。
$ id uid=1000(alice) gid=1001(alice) groups=1001(alice),1000(employees) $ whoami alice $ groups alice employees
ちなみに SUID 属性とか SGID 属性が id コマンドに付与しているとこんな感じで実ユーザー ID、実グループ ID と実効ユーザー ID と実効グループ ID をすべて表示する。
# /home/alice/id uid=0(root) gid=0(root) euid=1000(alice) egid=1001(alice) groups=1001(alice)
-u, --user オプション: 実効ユーザー ID を表示する
-u
オプションか --user
オプションを指定すると実効ユーザー ID (effective ID) を表示する。
$ id --user 1000
-u
オプションか --user
オプションと一緒に -n
オプションか --name
オプションを指定するとユーザーの ID の代わりにユーザーの名前を表示する。
このときの表示は whoami コマンドを実行するときの表示と同じ。
$ id --user --name alice $ whoami alice
-g, --group オプション: 実効グループ ID を表示する
-g
オプションか --group
オプションを指定すると実効グループ ID を表示する。
$ id --group 1001
-g
オプションか --group
オプションと一緒に -n
オプションか --name
オプションを指定するとグループの ID の代わりにグループの名前を表示する。
$ id --group --name alice
-G, --groups オプション: ユーザーが所属するすべてのグループ ID を表示する
-G
オプションか --groups
オプションを指定するとユーザーが所属するすべてのグループ ID を表示する。
$ id --groups 1001 1000
-G
オプションか --groups
オプションと一緒に -n
オプションか --name
オプションを指定するとグループの ID の代わりにグループの名前を表示する。
このときの表示は groups コマンドを実行するときの表示と同じ。
$ id --groups --name alice employees $ groups alice employees
-n, --name オプション: ID の代わりに名前を表示する
-n
オプションか --name
オプションを指定すると ID の代わりに名前を表示する。
-n
オプションと --name
オプションは単独で指定することはできなくて以下のオプションと一緒に使っていく。
-u
オプションか--user
オプション-g
オプションか--group
オプション-G
オプションか--groups
オプション
-r, --real オプション: 実効ユーザー ID の代わりに実ユーザー ID を表示する
id コマンドはデフォルトは 実効ユーザー ID と実効グループ ID を表示するけど -r
オプションか --real
オプションを指定すると実効ユーザー ID と実効グループ ID の代わりに実ユーザー ID と実効グループ ID を表示する。
ちょっと分かりにくい気がするので id コマンドをコピーして SUID 属性と SGID 属性をコピーした id コマンドに付与してから実行してみる。
まずユーザー alice が id コマンドをコピーして SUID 属性と SGID 属性をコピーした id コマンドに付与していく。
chmod ug+s
で SUID 属性と SGID 属性を id コマンドに付与してから ls コマンドを実行すると id コマンドのパーミッションが rwxr-xr-x
=> rwsr-sr-x
に変わっているのが確認できる。
$ whoami alice $ pwd /home/alice $ cp /usr/bin/id . $ ls -l ./id -rwxr-xr-x 1 alice alice 47632 Dec 30 06:04 ./id $ chmod ug+s ./id $ ls -l ./id -rwsr-sr-x 1 alice alice 47632 Dec 30 06:04 ./id
su -
で root になってから /home/alice/id
コマンドを実行するとユーザー ID とグループ ID はそれぞれ実効ユーザー ID の alice
と実効グループ ID の alice
が表示するけど、 --real
オプションを指定して /home/alice/id
コマンドを実行するとユーザー ID とグループ ID はそれぞれ実ユーザー ID の root
と実グループ ID の root
が表示する。
$ su - # whoami root # /home/alice/id --user --name alice # /home/alice/id --group --name alice # /home/alice/id --user --name --real root # /home/alice/id --group --name --real root
あと id コマンドをオプションなしで実行すると実ユーザー ID、実グループ ID と実効ユーザー ID と実効グループ ID をすべて表示する。
# /home/alice/id uid=0(root) gid=0(root) euid=1000(alice) egid=1001(alice) groups=1001(alice)
-z, --zero オプション
id コマンドはデフォルトでは区切り文字は空白だけど -z
オプションか --zero
オプションを指定すると NULL 文字を区切り文字にする。
あと実行例の最終行が aliceemployees$
みたいになってて id --groups --name --zero
の表示のあとに改行がなくてすぐプロンプトが表示している。
$ id --groups --name alice employees $ id --groups --name --zero aliceemployees$
-z
オプションと --zero
オプションはデフォルトの表示フォーマットでは指定できないので --user
オプションとか --group
オプションとかと組み合わせて指定していく。
$ id --zero id: option --zero not permitted in default format
-Z, --context オプション
-Z
オプションか --context
オプションを指定するとセキュリティコンテキストを表示する。
SELinux が無効な環境で実行するとこんな感じに表示するよう。
$ id --context sysadm_u:sysadm_r:sysadm_t:s0
SELinux が無効な環境で実行するとこんな感じに表示する。
$ docker container run --rm -it ubuntu:20.10 /bin/bash $ id --context id: --context (-Z) works only on an SELinux-enabled kernel
-a オプション: 他のバージョンとの互換性のためにあるオプション
-a
オプションは他のバージョンとの互換性のためだけにあるオプションで指定しても id コマンドの動作は一切変わらない。
$ id uid=1000(alice) gid=1001(alice) groups=1001(alice),1000(employees) $ id -a uid=1000(alice) gid=1001(alice) groups=1001(alice),1000(employees) $ id --user --name alice $ id --user --name -a alice