93967


# 環境

  * Ubuntu 22.04

# 背景

Linuxマシンに複数人（10人程度）がログインして利用しています。  
新しくユーザーを追加する際は、`useradd`コマンドを使用しています。

# 質問

以下のコマンドでユーザー一覧は確認できます。

[code]

    $ cat /etc/passwd
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      ...
      nginx:x:498:499:nginx user:/var/cache/nginx:/sbin/nologin
    
[/code]

しかし、`nginx`や`docker`など、サービスに関するユーザーも表示されます。

`useradd`コマンドで追加したユーザー（実際の人に対応するユーザー）を探すにはどうすればよいでしょうか？

`/home`ディレクトリと紐づているユーザーを探せば解決できそうですが、本当にこれで合っているのかが分からなかったので、質問しました。

[code]

    $ cat /etc/passwd | grep /home
    syslog:x:102:106::/home/syslog:/usr/sbin/nologin
    alice:x:1000:1000:alice,,,:/home/alice:/bin/bash
    
[/code]


CC BY-SA 4.0
2023-02-24T02:29:57.567
93966
2023-02-24T09:07:04.290
2023-02-24T09:07:04.290
3060
19524
question
linux
passwd ファイルから useradd コマンドで追加したユーザーを探したい


**useradd(1)**

> **`-u, --uid UID`**
>
> The numerical value of the user's ID. This value must be unique, unless the
> `-o` option is used. The value must be non-negative. **The default is to use
> the smallest ID value greater than or equal to`UID_MIN` and greater than
> every other user. See also the `-r` option and the `UID_MAX` description**.

> **`-r, --system`**
>
> System users will be created with no aging information in `/etc/shadow`, and
> their numeric identifiers are chosen in the `SYS_UID_MIN-SYS_UID_MAX` range,
> defined in `/etc/login.defs`, instead of `UID_MIN-UID_MAX` (and their `GID`
> counterparts for the creation of groups).

なので、以下の様にしてチェックすることもできるのですが、`uid` を `UID_MIN` 〜 `UID_MAX`
以外に指定して一般ユーザを作成することも可能なので万全とは言えません。

[code]

    bash$ read uid_min uid_max <<< $(awk '/^UID_/{print $2}' /etc/login.defs | xargs)
    bash$ awk -F: -v min=${uid_min} -v max=${uid_max} '$3>=min && $3<=max' /etc/passwd
    
[/code]


CC BY-SA 4.0
2023-02-24T03:00:13.563
93967
2023-02-24T03:00:13.563
47127
93966
answer


質問の条件からは外れてしまいますが、一応回答として記載します。  
`/etc/shadow`の第2フィールドが「暗号化されたパスワード」になっているので、そこに有効な値が設定されているかで、推測する案があります。

つまり、

  * 有効な値が入っていれば、ログインすることを目的としたユーザ(=人に対応するユーザ)
  * 有効な値が入っていなければ(無効な値ならば)、何らかのシステムユーザ

と推測する方法です。

＃「無効な値」とは「`x`」「`!`」「`*`」等です。

なお、`/etc/shadow`はrootユーザでないと読めないので、権限がない場合はこの案は使えません。


CC BY-SA 4.0
2023-02-24T04:03:27.110
93968
2023-02-24T04:03:27.110
20098
93966
answer