Linuxユーザーとグループ管理コマンド - ユーザ関連のID情報の確認とユーザーを切り替え


# ユーザ関連のID情報の確認
`id` コマンドを使用すると、ユーザのUIDやGIDなどの情報を調べることができます。

## 書式
```shell
id [OPTION]... [USER]
```

## 常用选项
- `-a` # 詳細情報を表示（デフォルトオプション）
- `-Z` または `--context` # セキュリティコンテキスト情報のみを表示（SELinuxを有効化する必要がある）
- `-g` または `--group` # GIDのみを表示する、つまりメイングループIDのみ
- `-G` または `--groups` # メイングループとサブグループのIDを表示、すなわち全グループID
- `-n` または `--name` # ユーザー名またはグループ名を表示（`-nu`、`-ng`、`-nG`と組み合わせて使用）
- `-u` または `--user` # UIDのみを表示する

## 例
```shell
id
uid=0(root) gid=0(root) groups=0(root)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

id -a
uid=0(root) gid=0(root) groups=0(root)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

id -nu
root

id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)

id -G postfix
89 12

id -nG postfix
postfix mail
```

# ユーザーを切り替えたり他のユーザーとしてコマンドを実行する
もし現在ログインしている端末で特定のコマンドを実行したいが、現在のユーザーに実行権限がない場合や特定のリソースへのアクセス権限がない場合には、以下の方法が考えられます：

1. 権限を持つユーザーが端末にログインし、操作を行う。
2. 現在の端末で一時的に切り替えて、権限を持つユーザーの身分でコマンドを実行する。

`su`（スイッチユーザー）コマンドはユーザの身分を切り替えて、指定したユーザの身分でコマンドを実行するためのものです。

## 書式
```shell
su [options...] [-] [user [args...]]
```

## 常见选项
- `-m`、`-p` または `--preserve-environment` # 環境変数をリセットしない
- `-g` または `--group group` # メイングループを指定（rootから一般ユーザーに切り替える場合のみ）
- `-`、`-l` または `--login` # 完全にユーザーを切り替える
- `-c` または `--command command` # ユーザーを切り替えずに特定のユーザーの権限でコマンドを一時的に実行
- `--session-command command` # `-c`オプションと似ていますが、新しいセッションは作成しません
- `-f` または `--fast` # シェルに `-f`（csh または tcsh用）を早めに渡す
- `-s` または `--shell shell` # ユーザーを切り替えた後の新しい環境のシェルを指定します、`/etc/shells` に存在する必要があります
- `-P` または `--pty` # 新しい端末を開く

## ユーザーの切り替え方
```shell
su UserName # 非ログイン式の切り替え、ユーザーの設定ファイルを読み込まず、作業ディレクトリも変更しない

su - UserName # ログイン式の切り替え、ユーザーの設定ファイルを読み込み、ホームディレクトリに移動する
```

## 補足
rootが他のユーザに`su`する際にはパスワードが不要ですが、rootでないユーザーが切り替える際にはパスワードが必要です。
注意点：`su`で新しいユーザに切り替えた後、元のユーザに戻る際には`exit`を使用してください。再度`su`で元のユーザに切り替えると多くのbashサブプロセスが生成され、環境が混乱する可能性があります。

## 完全切り替えと非完全切り替えの違い
- 非完全切り替えでは作業ディレクトリおよび環境変数PATHは変更されない。
- 完全切り替えではユーザーのホームディレクトリに切り替わり、PATHが更新される。

例：
```shell
# 非完全切り替えの例
[jose@rocky8 ~]$ su root
Password:
[root@rocky8 jose]# pwd
/home/jose
[root@rocky8 jose]# echo $PATH
/home/jose/.local/bin:/home/jose/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

# 完全切り替えの例
[jose@rocky8 ~]$ su - root
Password:
[root@rocky8 ~]# pwd
/root
[root@rocky8 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
```

## ユーザーを切り替えずに他のユーザーの権限でコマンドを実行する
一時的にユーザーを切り替えずに、他のユーザーの権限で直接コマンドを実行することもできます。例えば：

```shell
# suを使用して、ユーザーを切り替えてからjoseとしてファイルを作成する
[root@rocky8 ~]# su - jose
[jose@rocky8 ~]$ touch jose-1.txt
[jose@rocky8 ~]$ exit
logout

# 3ステップを1ステップにする
[root@rocky8 ~]# su - jose -c "touch jose-2.txt"
[root@rocky8 ~]# ls -l /home/jose/jose*
-rw-rw-r--. 1 jose jose 0 Jun 25 16:14 /home/jose/jose-1.txt
-rw-rw-r--. 1 jose jose 0 Jun 25 16:16 /home/jose/jose-2.txt
[root@rocky8 ~]# su - jose
[jose@rocky8 ~]$ id
uid=1000(jose) gid=1000(jose) groups=1000(jose)
[jose@rocky8 ~]$ exit
logout

# 3ステップを1ステップにする
[root@rocky8 ~]# su - jose -c "id"
uid=1000(jose) gid=1000(jose) groups=1000(jose)
```

/sbin/nologin や Ubuntuの /bin/false シェルを利用しているユーザーは、通常の方法で切り替えることはできませんが、切り替え可能なシェルを指定することで、一時的に切り替えることができます。

例：
```shell
[root@rocky8 ~]# getent passwd mysql
mysql:x:336:336::/data/mysql:/sbin/nologin
[root@rocky8 ~]# su - mysql
This account is currently not available.
[root@rocky8 ~]# su - mysql -c "echo nologin"
This account is currently not available.
# ただし、利用可能なシェルを指定することで一時的に切り替えることができる
[root@rocky8 ~]# su - mysql -s /bin/bash
[mysql@rocky8 ~]$ id
uid=336(mysql) gid=336(mysql) groups=336(mysql)
[root@rocky8 ~]# su - mysql -s /bin/bash -c "echo nologin"
nologin
```