全力で怠けたい

怠けるために全力を尽くしたいブログ。

ユーザー 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

参考サイト