Linux 如何识别用户?

Arc*_*ton 9 users authentication permissions multiuser

我的意思是,如果两个用户具有相同的名称,那么系统在强制执行文件权限时如何知道他们实际上是不同的用户?

当我考虑/home/old-arch在重新安装系统之前重命名我的家时,这个疑问出现在我的脑海中(我有/home自己的分区,我没有格式化它),这样我就可以拥有一个新的、原始的/home/arch. 我想知道新系统是否会给我对我的文件的旧权限,或者它是否会将我识别为不同的arch.

And*_*ton 22

如果您强制存在多个具有相同用户名的用户,那么将有多个/etc/{shadow,passwd}具有相同名称的条目:

$ cat /etc/passwd
...
a:x:1001:1002::/home/a:/bin/bash
a:x:1002:1003::/home/b:/bin/bash

# cat /etc/shadow
a:...:17702:0:99999:7:::
a:...:17702:0:99999:7:::
Run Code Online (Sandbox Code Playgroud)

如果您尝试以该用户身份登录,您将作为第一个匹配项登录。

$ ssh a@<host>
Password:
$ id
uid=1001(a) gid=1002(a) groups=1002(a)
$ pwd
/home/a
Run Code Online (Sandbox Code Playgroud)

将无法以相同名称的第二个用户身份登录。

请注意,Linux 通过用户名而不是用户名来跟踪用户。

但是,可能有两个不同的用户名是相同的用户 ID。考虑不同版本的/etc/passwd

$ cat /etc/passwd
...
a:x:1001:1002::/home/a:/bin/bash
b:x:1001:1002::/home/b:/bin/bash
Run Code Online (Sandbox Code Playgroud)

请注意,对于 usernamesab,第三列是 1001——这是 uid/用户 ID。现在,如果用户a或用户b登录(即使使用不同的密码),他们都将是“用户 1001”,并a从操作系统的角度显示为用户。在这里,第一个匹配的条目也是返回的条目(在大多数情况下):

$ ssh a@host
Password: <a's password>
$ id
uid=1001(a) gid=1002(a) groups=1002(a)

$ ssh b@host
Password: <b's password>
$ id
uid=1001(a) gid=1002(a) groups=1002(a)
Run Code Online (Sandbox Code Playgroud)

这两个ab的UID 1001,将有机会获得可用的UID资源1001

  • 请注意,我认为如果您尝试添加现有用户,即使是最基础的 `useradd` 也会引起不适,因此这里的“强制”几乎意味着“手动编辑 /etc/passwd”和“/etc/shadow”这是非常不要在家里尝试这个领域。 (9认同)

Lol*_*lan 11

在 Unix 中,用户通过他们的 ID (uid) 来标识,该 ID 必须是唯一的(在本地系统范围内)。因此,即使可以创建 2 个具有相同名称的不同用户(我系统上的 adduser 拒绝这样做,请参阅此问题以获取更多信息Can separate unix account share a username but have different passwords?),他们也需要得到不同的uid。虽然您可以操作包含用户信息的文件以符合您的条件,但每个程序都基于 uid 在系统上是唯一的假设,因此这些用户将是相同的。

编辑:另一个答案演示了这样一种情况,即您对同一个 uid 有 2 个不同的用户名-尽管就系统而言,这就像为同一用户使用两个不同的名称一样,因此应尽可能避免这样的构造,除非您特别想为系统上的用户创建别名(有关技术细节的更多信息,请参阅serverfault 上的unix 用户别名问题)。

系统使用这些 uid 来强制执行文件权限。文件所属用户的uid和gid(组id)写入文件的元数据中。如果您将磁盘携带到另一台计算机,该计算机具有随机共享相同 uid 的不同用户,则该文件将突然属于该系统上的该用户。知道 uid 在 unix 系统上通常不超过 16 位整数,这表明 uid 并不意味着全局唯一,仅在本地系统范围内唯一。


归档时间:

查看次数:

3643 次

最近记录:

7 年,3 月 前