【Linux】Linux的账号和用户组

管理员的工作中,相当重要的一环就是【管理账号】。

        因为整个系统都是你在管理,并且所有一般用户的账号申请,都必须要通过你的协助才行,所以你就必须要了解一下如何管理好一个服务器主机的账号。

        在管理Linux主机的账号时,我们必须先来了解一下Linux到底是如何辨别每一个用户的。

1.用户标识符:UID与GID

        虽然我们登录Linux主机的时候,输入的是我们的账号,但是其实Linux主机并不会直接认识你的【账号名称】,它仅认识ID(ID就是一组号码)。

        由于计算机仅认识0与1,所以主机对于数字比较有概念,账号只是为了让人们容易记忆而已,而你的ID与账号的对应就在/etc/passwd当中。

        如果你曾经在网络上下载过tarball类型的文件,那么应该不难发现,在解压缩之后的文件中,文件拥有者的字段竞然显示【不明的数字】!奇怪吧?这没什么好奇怪的,因为说实在话,Linux它真的只认识代表你身份的号码而已。

那么到底有几种ID呢?每一个文件都具有【拥有人与拥有人组】的属性吗?

没错,每个登录的用户至少都会获取两个ID

  1. 一个是用户ID(UserID,简称UID)
  2. 一个是用户组ID(GroupID,简称GID)。

那么文件如何判别它的拥有者与用户组呢?

其实就是利用UID与GID。

        每一个文件都会有所谓的拥有者 ID与拥有人组ID,当我们有要显示文件属性的需求时,系统会根据/etc/passwd与/etc/group的内容,找到UID与GID对应的账号与组名再显示出来。

        我们可以做个小实验,你可以用root的身份vim /etc/passwd,然后将你的一般身份的用户ID随便改一个号码,然后再到你的一般身份的目录下看看原先该账号拥有的文件,你会发现该文件的拥有人变成了【数字】。

呵呵!这样可以理解了吗?

来看看下面的例子:

#1.先查看一下,系统里面有没有一个名为zs_108的用户?

#看一看,使用者的栏位正是zs_108本身。

#2.修改一下,将刚刚我们的dmtsai的1002 UID改为2002看看。


修改一下第一个1002

很害怕吧,怎么变成1002了?因为文件只会记录UID的数字而已。因为我们乱改,所以导致1002找不到对应的账号,因此显示数字。

#3.记得将刚刚的2000改回来。

你一定要了解的是,上面的例子仅是在说明UID与账号的对应性。

        在一台正常运行的Linux主机环境下,上面的操作不可随便进行,这是因为系统上已经有很多的数据被建立存在了,随意修改系统上某些账号的UID很可能会导致某些程序无法运行,甚至导致系统无法顺利运行——因为权限的问题。

所以,了解了之后,请赶快回到/etc/passwd里面,将数字改回来。

举例来说,如果上面的测试最后一个步骤没有将2002改回原本的UID,那么当dmtsai下次登录时将没有办法进入自己的家目录。因为它的UID已经改为2002,但是它的家目录(/home/dmtsai)却记录的是1002,由于权限是700,因此它将无法进入原本的家目录,是否觉得非常严重啊?

2.用户账号

Linux 系统上面的用户如果需要登录主机以获取shelI的环境来工作时,它需要如何进行呢?

首先,它必须要在计算机前面利用tty1~tty6的终端提供的登录接口,并输入账号与密码后才能够登录。

如果是通过网络的话,那至少用户就得要学习SSh这个功能(服务器篇再来谈)。

那么你输入账号密码后,系统帮你处理了什么呢?

  • 1.先查找/etc/passwd 里面是否有你输入的账号?如果没有则退出,如果有的话则将该账号对应的UID与GID(在 /etc/group中)读出来,另外,该账号的家目录与shell 设置也一并读出。
  • 2.再来则是核对密码表。这时 Linux会进入/etc/shadow 里面找出对应的账号与UID,然后核对一下你刚刚输入的密码与里面的密码是否相符?
  • 3.如果一切都OK的话,就进入shell管理的阶段。

大致上的情况就像这样,所以当你要登录你的Linux主机的时候,那个/etc/passwd与etc/shadow 就必须要让系统读取(这也是很多攻击者会将特殊账号写到/etc/passwd里面去的缘故)。所以,如果你要备份Linux系统的账号的话,那么这两个文件就一定需要备份才行呦!

由上面的流程我们也知道,跟用户账号有关的有两个非常重要的文件,

  1. 一个是管理用户UID与GID 重要参数的/etc/passwd
  2. 另一个则是专门管理密码相关数据的 /etc/shadow

那这两个文件的内容就非常值得进行研究。下面我们会简单地介绍这两个文件,详细的说明可以参考 man 5 passwd及man 5 shadow)

2.1./etc/passwd文件结构

这个文件的构造是这样的:每一行都代表一个账号,有几行就代表有几个账号在你的系统中。

不过需要特别留意的是,里面很多账号本来就是系统正常运行所必须的,我们可以简称它为系统账号,例如bin、daemon、adm、nobody等,这些账号请不要随意删除。这个文件的内容有点像这样;

我们先来看一下每个Linux系统都会有的第1行,就是root这个系统管理员那一行。你可以明显地看出来,每一行使用【:】分隔开,共有七个东西分别是:

  • 1.账号名称

就是账号,提供给对数字不太敏感的人类使用来登录系统的,需要用来对应 UID,例如root的早期UID对应就是0(第三字段)。

  • 2.密码

UNIX系统的密码就是放在这字段上,但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取,因此后来就将这个字段的密码数据改放到/etc/shadow中了所以这里你会看到一个【X】,呵呵!

  • 3. UID

这个就是用户标识符。通常 Linux 对于 UID 有几个限制需要说给您了解一下:

ID范围该ID用户特性
          0
(系统管理员)

当UID是0时,代表这个账号是【系统管理员】,所以当你要让其他的账号名称也具有root 的权限时,将该账号的UID改为0即可。

        这也就是说,一台系统上面的系统管理员不见得只有root,不过,很不建议有多个账号的UID是0,容易让系统管理员混乱

   1~999

(系统账号)

保留给系统使用的|D,其实除了0之外,其他的 UID 权限与特性并没有不一样。默认1000以下的数字留给系统作为保留账号只是一个习惯。
        由于系统上面启动的网络服务或后台服务希望使用较小的权限去运行,因此不希望使用root的身份去执行这些服务,所以我们就得要提供这些运行中程序的拥有者账号才行。这些系统账号通常是不可登录的,所以才会 /sbin/nologin这个特殊的shell存在。
根据系统账号的由来,通常这类账号又大概被区分为两种:
  1. 1~200:由Linux发行版自行建立的系统账号;
  2. 201~999:若用户有系统账号需求时,可以使用的账号UID

 1000~60000

(可登录账号)

给一般用户使用。事实上,目前的Linux内核(3.10.x版)已经可以支持到4294967295(2^32-1)这么大的UID号码

上面这样说明可以了解了吗?是的,UID为0的时候,就是root,所以请特别留意一下你的/etc/passwd文件。

  • 4. GID

这个与/etc/group有关,其实/etc/group的概念与/etc/passwd差不多,只是它是用来规范组名与GID的对应而已。

  • 5.用户信息说明栏

这个字段基本上并没有什么重要用途,只是用来解释这个账号的意义而已。不过,如果您提供使
用finger的功能时,这个字段可以提供很多的信息。

  • 6.家目录

这是用户的家目录,以上面为例,root的家目录在/root,所以当root登录之后,就会立刻跑到/root目录里面。呵呵!如果你有个账号的使用空间特别的大,你想要将该账号的家目录移动到其他的硬盘去该怎么做?没有错,可以在这个字段进行修改。默认的用户家目录在/home/yourlDname.

  • 7. shell

当用户登录系统后就会获取一个shell来与系统的内核沟通以进行用户的操作任务。

那为何默认 shell会使用bash呢?

就是在这个字段指定的。

这里比较需要注意的是,有一个shell 可以使账号在登录时无法获得shell环境,那就是/sbin/nologin 这个东西。这也可以用来制作纯pop邮件账号的数据。

我们来复盘一下

2.2./etc/shadow 文件结构

我们知道很多程序的运行都与权限有关,而权限与UID和GID有关。

        因此各程序当然需要读取/etc/passwd 来了解不同账号的权限,因此/etc/passwd的权限需设置为-rw-r--r--这样的情况。虽然早期的密码也有加密过,但却放置到/etc/passwd的第二个字段上,这样一来很容易被有心人士所窃取,加密过的密码也能够通过暴力破解法去trial and error(试误)找出来。

        因为这样的关系,所以后来发展出将密码移动到/etc/shadow 这个文件分隔开来的技术,而且还加入很多的密码限制参数在/etc/shadow 里面。在这里,我们先来了解一下这个文件的构造。我的/etc/shadow 文件有点像这样:


基本上,shadow 同样以【:】作为分隔符,如果数一数,会发现共有九个字段,这九个字段的用途是这样的:

  • 1.账号名称

由于密码也需要与账号对应,因此,这个文件的第一栏就是账号,必须要与/etc/passwd 相同才行。

  • 2.密码

这个字段内的数据才是真正的密码,而且是经过编码的密码(摘要)。你只会看到有一些特殊符号的字母。

需要特别留意的是,虽然这些加密过的密码难被破解,但是【很难】不等于【不会】,所以这个文件的默认权限是【-rw-------】或是【----------】,即只有root才可以读写。

你得随时注意,不要不小心修改了这个文件的权限。

另外,由于各种密码编码的技术不一样,因此不同的编码系统会造成这个字段的长度不相同。举例来说,旧式的DES、MD5 摘要算法产生的密码长度就与目前常用的SHA不同。SHA的密码长度明显比较长些。由于固定的摘要算法产生的密码是特定的,因此【当你修改这个字段后,该密码就会失效(算不出来)】。

很多软件通过这个功能,在此字段前加上!或*修改密码字段,就会让密码【暂时失效】。

  • 3.最近修改密码的日期

这个字段记录了【修改密码那一天】的日期,不过,很奇怪呀,在我的例子中怎么会是19875呢?

呵呵!这个是因为计算Linux日期的时间是以1970年1月1日作为1而累加的日期,1971年1月1日则为366。得注意一下这个数据,上述的19875指的就是2024-06-01这一天。

了解了么?而想要了解该日期可以使用chage命令。

至于想要知道某个日期的累积日数,可使用如下的程序计算:

上述命令中,2024/06/01为你想要计算的日期,86400为每一天的秒数,%s为1970/01/01以来的累积总秒数。由于bash仅支持整数,因此最终需要加上1补齐1970/01/01当天。

  • 4.密码不可被修改的天数(与第三字段相比)

第四个字段记录了这个账号的密码在最近一次被更改后需要经过几天才可以再被修改。

  1. 如果是0的话,表示密码随时可以修改,这个限制是为了怕密码被某些人一改再改而设计的。
  2. 如果设置为20天的话,那么当你设置了密码之后,20天之内都无法再修改这个密码。
  • 5.密码需要重新修改的天数(与第三字段相比)

经常修改密码是个好习惯。

        为了强制要求用户修改密码,这个字段可以指定在最近一次更改密码后,在多少天数内需要再次修改密码才行。你必须要在这个天数内重新设置你的密码,否则这个账号的密码将会【变为过期特性】。而如果像上面的99999(计算为273年)的话,那就表示密码的修改没有强制性之意。

  • 6.密码需要修改期限前的警告天数(与第五字段相比)

则是密码到期之前的7天之内,系统会警告该用户。

  • 7.密码过期后的账号宽限时间(密码失效日)(与第五字段相比)

当账号的密码有效期限快要到的时候(第五字段),系统会根据这个字段的设置,发出【警告】信息给这个账号,提醒它【再过n天你的密码就要过期了,请尽快重新设置你的密码】

        如上面的例子,密码有效日期为【更新日期(第三字段)】+【重新修改日期(第五字段)】,过了该期限后用户做旧没有更新密码,那该密码就算过期了。

        虽然密码过期但是该账号还是可以用来执行其他的任务,包括登录系统获取bash。

        不过如果密码过期了,那当你登录系统时,系统会强制要求你必须要重新设置密码才能登录继续使用,这就是密码过期特性。

  • 8.账号失效日期

那这个字段的功能是什么呢?

        是在密码过期几天后,如果用户还是没有登录更改密码,那么这个账号的密码将会【失效】,即该账号再也无法使用该密码登录。

        要注意密码过期与密码失效并不相同。

        这个日期跟第三个字段一样,都是使用1970年以来的总天数。这个字段表示:这个账号在此字段规定的日期之后,将无法再使用。就是所谓的【账号失效】,此时不论你的密码是否过期,这个【账号】都不能再被使用。这个字段会被使用通常应该是在【收费服务】的系统中,你可以规定一个日期让该账号不能再使用。

  • 9.保留

最后一个字段是保留的,看以后有没有新功能加入。

举个例子来说好了,假如我的dmtsai 这个用户的密码栏如下所示:

dmtsai:$6$M4IphHksnjijijij...:16559:5:60:7:5:16679:

这表示什么呢?

先要注意的是16559是2015/05/04,所以dmtsai 这个用户的密码相关意义是:

  • 由于密码几乎仅能单向运算(由明码计算成为摘要密码,无法由密码反推回明码),因此由上表的数据我们无法得知dmstai的实际密码明文(第二个字段);
  • 此账号最近一次修改密码的日期是2015/05/04(16559);
  • 能够再次修改密码的时间是5天以后,也就是2015/05/09以前dmtsai不能修改自己的密码;
  • 如果用户还是尝试要修改自己的密码,系统就会出现这样的信息:
You must wait longer to change your password
passwd: Authentication token manipulation error

画面中告诉我们:你必须要等待更久的时间才能够修改密码。

  • 由于密码过期日期定义为60天后,即累积日数为16559+60=16619,经过计算得到此日数代表日期为2015/07/03。这表示:【用户必须要在2015/05/09(前5天不能改)到2015/07/03之间的60天限制内去修改自己的密码,若2015/07/03之后还是没有修改密码,该密码就声明为过期】
  • 警告日期设为7天,即密码过期日前的7天,在本例中则代表2015/06/26-2015/07/03这7天。如果用户一直没有更改密码,那么在这7天中,只要 dmtsai登录系统就会发现如下的信息;
Warning: your password will expire in 5 days
  • 如果该账号一直到2015/07/03 都没有更改密码,那么密码就过期了。但是由于有5天的宽限天数,因此dmtsai在2015/07/08前都还可以使用旧密码登录主机。不过登录时会出现强制更改密码的情况,画面有点像下面这样:
You are required to change your password immediately (password aged)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user dmtsai.
Changing password for dmtsai
(current) UNIX password:

你必须要输入一次旧密码以及两次新密码后,才能够开始使用系统的各项资源。如果你是在2015/07108 以后尝试以dmtsai登录的话,那么就会出现如下的错误信息且无法登录,因为此时你的密码就失效了。

your account has expired; please contact your system administrator
  • 如果用户在2015/07/03以前修改过密码,那么第三个字段的那个16559的天数就会跟着修改,因此,所有的限制日期也会跟着相对变动。
  • 无论用户如何操作,到了16679(大约是2015/09/01左右)该账号就失效。

通过这样的说明,您应该会比较容易理解了吧?

由于 shadow 有这样的重要性,因此可不能随意修改。

但在某些情况下,你得要使用各种方法来处理这个文件。

举例来说,常常听到人家说【我的密码忘记了】或是【我的密码不晓得被谁改过,跟原先的不一样了】,这个时候怎么办?

一般用户的密码忘记了:

这个最容易解决,请系统管理员帮忙,它会重新设置好你的密码而不需要知道你的旧密码,以root的身份使用passwd命令来处理即可。

root密码忘记了:

这就麻烦了,因为你无法使用root的身份登录了嘛!

但我们知道root的密码在/etc/shadow当中,因此你可以使用各种可行的方法启动进入Linux再去修改。例如

  • 重新启动进入单人维护模式后,系统会主动给予root权限的bash接口,此时再以passwd修改密码即可。
  • 或以Live CD启动后挂载根目录去修改/etc/shadow,将里面的root的密码字段清空,再重新启动后 root不用密码即可登录,登录后再赶快以passwd命令去设置root密码即可。

另外,由于Linux的新旧版本差异颇大,旧的版本(CentOS5.×以前)还活在很多服务器内。因此,如果你想要知道shadow是使用哪种加密的机制时,可以通过下面的方法去查询。

[root@study ~l# authconfig --test / grep hashing
password hashing algorithm is sha512

#这就是目前的密码加密机制。

3.关于用户组:有效与初始用户组,groups,newgr

认识了与账号相关的两个文件/etc/passwd与/etc/shadow之后,你或许还是会觉得奇怪,那么用户组的配置文件在哪里呢?

还有,在/etc/passwd的第四栏不是所谓的GID吗?那又是啥?呵呵!此时就需要了解/etc/group与/etc/gshadow。

3.1./etc/group文件结构

这个文件就是在记录GID与组名的对应记录,我的/etc/group内容有点像这样:
这个文件每一行代表一个用户组,也是以冒号【:】作为字段的分隔符,共分为四栏,每一字段的意义是:

  • 1.组名

就是组名。同样用来给人使用,基本上需要与第三字段的GID对应。

  • 2.用户组密码

通常不需要设置,这个设置通常是给【用户组管理员】使用,目前很少有这个机会设置用户组管
理员。同样,密码已经移动到/etc/gshadow中,因此这个字段只会存在一个【x】而已。

  • 3. GID

就是用户组 ID。我们/etc/passwd第四个字段使用的GID对应的用户组名,就是由这里对应出
来的。

  • 4.此用户组支持的账号名称

我们知道一个账号可以加入多个用户组,如果某个账号想要加入此用户组时,将该账号填入这个字段即可。

举例来说,如果我想要让dmtsai与alex也加入root这个用户组,那么在第一行的最后面加上【dmtsai,alex 】,注意不要有空格,使其成为【root:x:0:dmtsai,alex】就可以。

        谈完了/etc/passwd、/etc/shadow、/etc/group之后,我们可以使用一个简单的示意图来了解一下UID/GID与密码之间的关系,图例如下。

其实重点是/etc/passwd,其他相关的数据都是根据这个文件的字段去找寻出来的。

图中,root的UID是0,而GID也是0,去找/etc/group可以知道GID为0时的组名就是root。至于密码的寻找中,会找到/etc/shadow 与/etc/passwd 内同账号名称的那一个,就是密码相关数据。

        至于/etc/group比较重要的特色在于第四栏,因为每个用户都可以拥有多个支持的用户组,这就好比在学校念书的时候,我们可以加入多个社团一样。

        不过这里你或许会觉得奇怪,那就是:【假如我同时加入多个用户组,那么我在作业的时候,到底是以哪个用户组为准呢?】下面我们就来谈一谈这个【有效用户组】的概念。

        请注意,新版的Linux中,初始用户组的用户群已经不会加入第四个字段。例如我们知道root这个账号的主要用户组为root,但是在上面的范例中,你已经不会看到root这个【用户】的名称在/etc/group的root那一行的第四个字段内,这点还请留意一下。

3.1.1.有效用户组(effective group)与初始用户组(initial group)

        还记得每个用户在它的/etc/passwd里面的第四栏有所谓的GID吧?

        那个GID就是所谓的【初始用户组(initial group)】。也就是说,当用户一登录系统,立刻就会拥有这个用户组的相关权限。

举例来说,我们上面提到dmtsai 这个用户的 /etc/passwd 与/etc/group 还有/etc/gshadow相关的内容如

[root@study~]#usermod-a-G users dmtsai<==先设置好次要用户组。
[root@study ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow
/etc/passwd:dmtsai:x:1000:1000:dmtsal:/home/dmtsai:/bin/bash
/etc/group:wheel:x:10:dmtsai<==次要用户组的设置、安装时指定的。
/etc/group:users:x:100:dmtsai<==次要用户组的设置。
/etc/group:dmtsai:x:1000:<==因为是初始用户组,所以第四栏位不需要填入账号.
/etc/gshadow:wheel:::dmtsai<==次要用户组的设置。
/etc/gshadow:users:::dmtsai<==次要用户组的设置。
/etc/gshadow:dmtsai:!!::

仔细看上面这个表格,在/etc/passwd 里面,dmtsai 这个用户所属的用户组为 GID=1000,查

        找一下/etc/group得到1000是那个名为dmtsai的用户组,这就是初始用户组。因为是初始用户组,用户一登录就会主动获取,不需要在/etc/group的第四个字段写入该账号。

        但是非初始用户组的其他用户组可就不同了。举上面这个例子来说,我将dmtsai加入users这个用户组当中,由于users 这个用户组并非是dmtsai的初始用户组,因此,我必须要在/etc/group这个文件中,找到users 那一行,并且将dmtsai这个账号加入第四栏,这样dmtsai才能够加入users这个用户组。

        那么在这个例子当中,因为我的dmtsai 账号同时支持dmtsai、wheel与users这三个用户组,因此,在读取、写入、执行文件时,针对用户组部分,只要是users、wheel与dmtsai这三个用户组拥有的功能,dmtsai这个用户都能够拥有。

        这样了解了吗?不过,这是针对已经存在的文件而言,如果今天我要建立一个新的文件或是新的目录,请问一下,新文件的用户组是dmtsai、wheel还是users 呢?

呵呵!这就要检查一下当时的有效用户组了(effective group )。

  • groups:有效与支持用户组的观察

如果我以dmtsai 这个用户的身份登录后,该如何知道我所有支持的用户组?很简单,直接输入groups就可以了。注意,是groups有加s,结果像这样:

[dmtsai@study -]$ groups
dmtsai wheel users

在这个输出的信息中,可知道dmtsai 这个用户同时属于dmtsai、wheel及users这三个用户组,而且,第一个输出的用户组即为有效用户组(effective group)。

也就是说,我的有效用户组为dmtsai,此时,如果我以touch 去建立一个新文件,例如 【 touch test 】,那么这个文件的拥有者为dmtsai,而且用户组也是dmtsai。

[dmtsai@study -]$ touch test
[dmtsai@study ~]$ ll test
-rw-rw-r--. 1 dmtsai dmtsai 0 Jul 20 19:54 test

这样是否可以了解什么是有效用户组了呢?

通常有效用户组的作用是新建文件。

那么有效用户组是否能够变换?

  • newgrp:有效用户组的切换

那么如何修改有效用户组呢?

要使用newgrp。

不过使用newgrp是有限制的,那就是你想要切换的用户组必须是你已经有支持的用户组。

        举例来说,dmtsai 可以在dmtsai、wheel、users这三个用户组间切换为有效用户组,但是dmtsai无法切换有效用户组成为sshd,使用的方式如下:

[dmtsai@study ~]$ newgrp users
[dmtsai@study ~]$ groups
users wheel dmtsai
[dmtsai@study ~]$ touch test2
[dmtsai@study ~]$ ll test*
-rw-rw-r--. 1 dmtsai dmtsai 0 Jul 20 19:54 test
-rw-r--r--. 1 dmtsai users  0 Jul 20 19:56 test2
[dmtsai@study ~]$ exit

# 注意,记得退出newgrp的环境。

此时,dmtsai的有效用户组就成为users了。

我们额外来讨论一下newgrp这个命令。

这个命令可以修改目前用户的有效用户组,而且是另外以一个shell 来提供这个功能。

所以,以上面的例子来说,dmtsai这个用户目前是以另一个shell登录的,而且新的shell给予dmtsai有效GID为users。

如果以图例来看就是如右图所示:

虽然用户的环境设置(例如环境变量等其他数据)不会有影响,但是用户的【用户组权限】将会重新被计算。

需要注意,由于是新获取一个shell,因此如果你想要回到原本的环境中,请输入exit回到原本的shell。

        既然如此,也就是说,只要我的用户有支持的用户组就是能够切换成为有效用户组。

好了,那么如何让一个账号加入不同的用户组就是问题的所在。

你要加入一个用户组有两个方式,

  1. 一个方式是通过系统管理员(root)利用usermod帮你加入;
  2. 另一个方式,如果root太忙了而且你的系统有设置用户组管理员,那么你可以通过用户组管理员以gpasswd帮你加入它所管理的用户组中。

3.1.2./etc/gshadow

刚刚讲了很多关于【有效用户组】的概念,也提到了newgrp这个命令的用法,但是如果letc/gshadow 这个设置没有搞懂的话,那么newgrp是无法操作的。

我的/etc/gshadow的内容有点像这样:

        这个文件内同样还是使用冒号【:】来作为字段的分隔字符,而且你会发现,这个文件几乎与/etc/group 一模一样。

        是这样没错,不过,要注意的大概就是第二个字段吧,第二个字段是密码栏,如果密码栏上面是【!】或为空时,表示该用户组不具有用户组管理员。

至于第四个字段也就是支持的账号名称,这四个字段的意义为;

  • 1.组名。
  • 2.密码栏,同样的,开头为!表示无合法密码,所以无用户组管理员。
  • 3.用户组管理员的账号(相关信息在gpasswd中介绍)。
  • 4.有加入该用户组支持的所属账号(与/etc/group内容相同)。

以系统管理员的角度来说,这个gshadow 最大的功能就是建立用户组管理员。

那么  什么是用户组管理员呢?

        由于系统上面的账号可能会很多,但是我们root可能平时太忙碌,所以当有用户想要加入某些用户组时,root或许会没有空管理。

        此时如果能够建立用户组管理员的话,那么该用户组管理员就能够将那个账号加入自己管理的用户组中,可以免去root的忙碌。

        不过,由于目前有类似sudo之类的工具,所以这个用户组管理员的功能已经很少使用了,我们会在后续的gpasswd中介绍这方面的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django 删除单行数据

1&#xff0c;添加模型 from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharField(max_length100)author…

121. 小红的区间翻转(卡码网周赛第二十五期(23年B站笔试真题))

题目链接 121. 小红的区间翻转&#xff08;卡码网周赛第二十五期&#xff08;23年B站笔试真题&#xff09;&#xff09; 题目描述 小红拿到了两个长度为 n 的数组 a 和 b&#xff0c;她仅可以执行一次以下翻转操作&#xff1a;选择a数组中的一个区间[i, j]&#xff0c;&#x…

顺序表算法 - 移除元素

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-element/description/思路: 代码: // numsSize表示数组的长度 …

网络安全——防御课实验二

在实验一的基础上&#xff0c;完成7-11题 拓扑图 7、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 首先&#xff0c;按照之前的操作&#xff0c;创建新的安全区&#xff08;电信和移动&#xff09;分别表示两个外网…

Readiris PDF Corporate / Business v23 解锁版安装教程 (PDF管理软件)

前言 Readiris PDF Corporate / Business 是一款高性能的 OCR&#xff08;光学字符识别&#xff09;软件&#xff0c;能够帮助用户将纸质文档、PDF 文件或图像文件转换为可编辑和可搜索的电子文本。该软件提供专业级的功能和特性&#xff0c;非常适合企业和商业使用。使用 Rea…

基于lstm的股票Volume预测

LSTM&#xff08;Long Short-Term Memory&#xff09;神经网络模型是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它在处理长期依赖关系方面表现出色&#xff0c;尤其适用于时间序列预测、自然语言处理&#xff08;NLP&#xff09;和语音识别等领域。以下是…

LabVIEW人工模拟肺控制系统开发

开发了一种创新的主被动一体式人工模拟肺模型&#xff0c;通过LabVIEW开发的上位机软件&#xff0c;实现了步进电机驱动系统的精确控制和多种呼吸模式的模拟。该系统不仅能够在主动呼吸模式下精确模拟快速呼吸、平静呼吸和深度呼吸&#xff0c;还能在被动模式下通过PID控制实现…

C++20中的consteval说明符

在C20中&#xff0c;立即函数(immediate function)是指每次调用该函数都会直接或间接产生编译时常量表达式(constant expression)的函数。这些函数在其返回类型前使用consteval关键字进行声明。 立即函数是constexpr函数&#xff0c;具体情况取决于其要求。与constexpr相同&…

神经网络以及简单的神经网络模型实现

神经网络基本概念&#xff1a; 神经元&#xff08;Neuron&#xff09;&#xff1a; 神经网络的基本单元&#xff0c;接收输入&#xff0c;应用权重并通过激活函数生成输出。 层&#xff08;Layer&#xff09;&#xff1a; 神经网络由多层神经元组成。常见的层包括输入层、隐藏层…

springboot健身房预约管理系统-计算机毕业设计源码75535

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.1.1经济可行性 2.1.2技术可行性 2.1.3操作可行性 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 …

Gradle学习-6 APT 实现一个路由跳转框架(APT、发布maven仓库)

Annotation 注解&#xff1a;注解是元数据&#xff0c;即描述数据的数据APT&#xff08;Annotation Processing Tool&#xff09;注解处理器 APT工作原理 Demo介绍 APT项目地址 使用APT maven仓库地址 &#xff08;1&#xff09;项目配置 Gradle 8.2AGP 8.2.0Java jdk 17…

调整网络安全策略以适应不断升级的威胁形势

关键网络安全统计数据和趋势 当今数字时代网络安全的重要性

Python爬虫速成之路(2):爬天气情况

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

nginx的四层负载均衡实战

目录 1 环境准备 1.1 mysql 部署 1.2 nginx 部署 1.3 关闭防火墙和selinux 2 nginx配置 2.1 修改nginx主配置文件 2.2 创建stream配置文件 2.3 重启nginx 3 测试四层代理是否轮循成功 3.1 远程链接通过代理服务器访问 3.2 动图演示 4 四层反向代理算法介绍 4.1 轮询&#xff0…

docker 上传镜像到hub仓库

要将 Docker 镜像上传到 Docker Hub&#xff0c;你需要按照以下步骤操作&#xff1a; 登录 Docker Hub 首先&#xff0c;你需要登录到 Docker Hub。打开终端并运行以下命令&#xff1a;docker login系统会提示你输入 Docker Hub 的用户名和密码。 如果密码忘记可以token登录&a…

MySQL复合查询(重点)

前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 基本查询回顾 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J mysql> select * from emp where (sal>500 or jobMANAGER) and ename l…

【数据结构初阶】详解 环形链表:链表的带环问题(判断是否带环、环形链表的入口点)

文章目录 一、链表的带环问题1.1、判断链表是否带环&#xff08;力扣 141.环形链表&#xff09;1.2 、证明&#xff1a;为什么带环时快慢指针一定相遇&#xff1f;1.3、证明&#xff1a;当slow走1步&#xff0c;fast可走3/4/5步&#xff08;fast的速度是slow的3/4/5倍&#xff…

Open3d入门 一文读懂三维点云

三维点云技术的发展始于20世纪60年代&#xff0c;随着激光雷达和三维扫描技术的进步&#xff0c;在建筑、考古、地理信息系统和制造等领域得到了广泛应用。20世纪90年代&#xff0c;随着计算机处理能力的提升&#xff0c;点云数据的采集和处理变得更加高效&#xff0c;推动了自…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

【调试笔记-20240713-Windows-Tauri 多个HTML页面支持】

调试笔记-系列文章目录 调试笔记-20240713-Windows-Tauri 多个HTML页面支持 文章目录 调试笔记-系列文章目录调试笔记-20240713-Windows-Tauri 多个HTML页面支持 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤搜索相似问题 三、应用场…