188. Linux用户与用户组

Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

每个用户账号都拥有一个唯一的用户名和各自的口令。

用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

实现用户账号的管理,要完成的工作主要有如下几个方面:

  • 用户账号的添加、删除与修改。
  • 用户口令的管理。
  • 用户组的管理。

用户

3种类型的用户

普通用户:普通用户是使用系统真实用户人群。普通用户通常把/bin/bash作为登录Shell和/home的子目录作为主目录。一般情况下,普通用户只在自己的主目录和系统范围内的临时目录里(如/tmp和/var/tmp)创建文件。在redhat企业版linux中,普通用户的用户ID数通常大于500.

root用户:用户ID为0的用户,也被称为超级用户,root用户在系统上拥有完全权限,可以修改和删除任何文件,可以运行任何命令,可以取消任何进程。root用户负责增加和保留其他用户、配置硬件、添加系统软件。虽然root用户可以在系统上的任何地方创建文件,但它也通常使用/root作为主目录.

系统用户:大多数linux系统保留一系列低UID值用户作为系统用户,系统用户不代表人,而代表系统的组成部分。例如,运行Apache网络服务器的进程经常作为用户apache( 见passwd文件中apache用户信息)来运行。系统用户一般没有登录Shell,因为它不代表实际登录的用户。同样,系统用户的主目录很少在/home中,而通常在属于相关应用的系统目录中。例如,用户apache的主目录是/var/www。在redhat企业版linux中,系统用户的UID值范围在1-499之间。

操作中常用linux命令

检查进程用户ID

1
2
3
4
5
6
7
8
[root@xxx /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 167664 13200 ? Ss Dec02 0:22 /lib/systemd/systemd --system --deserialize 91
root 2 0.0 0.0 0 0 ? S Dec02 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Dec02 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< Dec02 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< Dec02 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< Dec02 0:00 [netns]

根据用户名列出目录所有者

1
2
3
[root@xxx /]# ls -l
drwxrwxr-x 5 qeuroal qeuroal 4096 Nov 21 00:12 Document
drwxrwxr-x 13 qeuroal qeuroal 4096 Nov 24 04:22 vimart

根据用户ID列出目录所有者

1
2
3
4
[root@xxx /]# ls -ln
total 8
drwxrwxr-x 5 1001 1001 4096 Nov 21 00:12 Document
drwxrwxr-x 13 1001 1001 4096 Nov 24 04:22 vimart

说明:linux内核不保存拥有文件的用户的用户名,保存的是用户ID,每次ls命令运行时,必须在/etc/passwd文件中查找用户名与用户ID映射,然后把用户名对应到内核所提供的用户ID上。

添加账号

添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录 Shell 等资源。

useradd

  • 命令格式: useradd 选项 用户名

    参数说明:

    • 选项

      选项 参数 说明
      -c comment 指定一段注释性描述。
      -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
      -g 用户组 指定用户所属的用户组。
      -G 用户组1,用户组2,… 指定用户所属的附加组。
      -s Shell文件 指定用户的登录Shell。
      -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
    • 用户名: 指定新账号的登录名

  • 示例

    1
    [root@iZbp16w4b9baac6xlzfcdmZ ~]# useradd -s /bin/sh -g group –G adm,root newuser

    此命令创建了一个用户newuser,其中-m选项用来为登录名newuser产生一个主目录 /home/newuser. 该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。

  • 理解

    加用户账号就是在 /etc/passwd 文件中为新用户增加一条记录,同时更新其他系统文件如 /etc/shadow, /etc/group 等。

    本质:Linux 中一切皆文件,这里的添加用户说白了就是往某一个文件中写入用户的信息了!/etc/passwd

adduser

在 Ubuntu 中,有两个命令可用于创建新的用户。分别是 useraddadduseruseradd是一个用于添加用户的最普遍命令,所有发行版都支持。

adduseruseradd 的友好交互式前端,adduser 是用 Perl 语言编写的。我们建议如果你在编写 shell 脚本时使用 useradd 添加用户。

如果你只是手动创建一个或者几个用户,在 ubuntu 中建议你使用 adduser,adduser 可以在一条命令完成创建用户的过程。

如果你需要在批量创建用户请参考我们的教程,Linux useradd 命令创建用户

要在 Ubuntu 创建用户,请运行命令 adduser,后跟用户名作为参数。例如命令 sudo adduser myfreax 将会创建用户 myfreax。

命令将向你询问一系列的问题。密码是必需的,其他字段都是可选的。

区别

使用 sudo useradd newuser/home 里并没有 newuser 的目录。

查询得知,可以用 useradd -m newuser,但是 -m 这个命令只有在你创建用户的时候才有用。

如果已经创建了用户且没有目录的话,useradd -m newuser 是不会为用户创建目录的,也就是说必须删掉这个用户再重新 useradd -m newuser 才可以。

但是!使用 adduser 的话直接 adduser username 也会有目录,不用像 useradd 那样用 -m 了。但是 adduser 一创建就会要求输入密码。useradd 创建的时候就不会要求输入密码。

QA

Q: linux使用useradd创建的用户没有目录的解决办法

A: 我使用 sudo useradd newuser 后 /home里并没有 newuser的目录。查询百度得知,可以用 useradd -m newuser,但是-m这个命令只有在你创建用户的时候才有用。

如果已经创建了用户且没有目录的话,useradd -m newuser是不会为用户创建目录的,也就是说我必须删掉这个用户再重新useradd -m newuser才可以。这样的话会非常麻烦

目前我试了一下 usermod -d /home/newuser -m newuser 是没有效果的。

但是!使用adduser的话直接adduser username也会有目录,不用像useradd那样用-m了。但是adduser一创建就会要求输入密码。useradd创建的时候就不会要求输入密码。

删除帐号

如果不再需要用户,可以从命令行或通过 GUI 删除它。在 ubuntu 中删除用户方式也是有两种。

您可以使用两个命令来删除用户,分别是 userdeldeluser。在 Ubuntu,建议您使用 deluser 命令,因为它比 userdel 更友好。

同样在脚本中,我们建议你使用 userdel 而不是 deluser。因为其它发行版不存在 deluser。**deluser 仅在基于 Ubuntu 的发行版存在。**

userdel

要使用 userdel 命令删除用户,您需要以root或具有sudo访问权限的用户身份登录。

  • 命令的语法形式: userdel [OPTIONS] USERNAME

    OPTIONSuserdel命令的选项,可选参数,USERNAME 是用户名。

    OPTION 说明
    -r/--remove 选项强制 userdel 命令删除用户的家目录和邮件。
    userdel 命令不会删除位于家目录之外的用户文件。您必须手动搜索并删除文件。
    -f/--force 即使用户仍在登录状态或者存在属于该用户正在运行的进程。
  • 示例

    1
    2
    sudo userdel -r username
    sudo userdel -f username
  • 流程详解

    1. 在运行 userdel 命令时,userdel 命令将会读取/etc/login.defs文件内容。
    2. /etc/login.defs文件定义了 userdel 命令的默认行为。如果在此文件将USERGROUPS_ENAB 设置 为yes
    3. userdel 命令将会删除与用户同名的组,通常是用户主要组,但前提是其他用户不是该组的成员。
    4. 最后 userdel 命令将从 /etc/passwd/etc/shadow 文件中删除用户的记录。例如命令 sudo userdel username 将会删除用户 username
  • 注意

    • 不允许删除用户的情况

      如果你要删除的用户在登录状态,或者存在属于该用户的正在运行的进程,userdel 命令将不允许您删除当前用户。

      在这种情况下,建议使用 killall 命令终止用户所有正在运行的进程并注销(登出/退出)用户。完成后,您将能够删除该用户。

      1
      sudo killall -u username

deluser

deluser 仅在指定用户参数时,deluser 将删除用户而不删除用户文件。如果你需要用户的家目录和邮件等信息请使用 --remove-home 选项。

1
sudo deluser --remove-home username

修改用户

usermod 是一个命令行程序,可让您修改用户的登录信息和所属组。

主要功能有:

  • 将用户加入到指定组。
  • 更改用户默认的登录 Shell,UID,登录名,家目录,更改/修改用户主要组,更改GECOS/用户的全名信息。
  • 修改用户的有效期限或者是到期日期,锁定或者解锁用户帐号,禁止用户登录。

usermod 命令

usermod 命令的语法形式是 usermod [options] USERoptionsusermod 命令的选项,可选参数。USER 是 Linux 系统用户名。

只有root用户或具有 sudo 权限的用户才能运行 usermod 命令并修改用户帐户。usermod 成功后不打印任何输出,且退出代码是0。

添加用户到次要组

usermod 最典型的用例是将用户加入指定的组。要将用户添加到次要组,请使用usermod 命令的 -a-G 选项,然后输入组的名称和用户名。

将用户添加次要组时,你应该始终使用 -a 选项追加。如果省略 -a 选项,则用户将从 -G 选项之后未列出的组中删除。

如果要一次将用户添加到多个组,请在 -G 选项指定多个组名称,并使用逗号,分隔。

例如命令 sudo usermod -a -G games myfreax 会将用户 myfreax 添加到 games 组。如果指定的用户或组不存在,usermod 命令将给出警告且退出代码不为0。

1
2
#usermod -a -G GROUP USER
sudo usermod -a -G games myfreax

添加用户到次要组-方法2

为了避免系统管理员(root)太忙碌,无法及时管理群组,我们可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。

gpasswd 命令的基本格式如下:

1
[root@localhost ~]# gpasswd 选项 组名
选项 功能
选项为空时,表示给群组设置密码,仅 root 用户可用。
-A user1,… 将群组的控制权交给 user1,… 等用户管理,也就是说,设置 user1,… 等用户为群组的管理员,仅 root 用户可用。
-M user1,… 将 user1,… 加入到此群组中,仅 root 用户可用。
-r 移除群组的密码,仅 root 用户可用。
-R 让群组的密码失效,仅 root 用户可用。
-a user 将 user 用户加入到群组中。
-d user 将 user 用户从群组中移除。

为了避免系统管理员(root)太忙碌,无法及时管理群组,我们可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。

1
2
3
4
5
6
7
8
9
10
#创建新群组 group1,并将群组交给 lamp 管理
[root@localhost ~]# groupadd group1 <-- 创建群组
[root@localhost ~]# gpasswd group1 <-- 设置密码吧!
Changing the password for group group1
New Password:
Re-enter new password:
[root@localhost ~]# gpasswd -A lamp group1 <==加入群组管理员为 lamp
[root@localhost ~]# grep "group1" /etc/group /etc/gshadow
/etc/group:group1:x:506:
/etc/gshadow:group1:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:lamp:

可以看到,此时 lamp 用户即为 group1 群组的管理员。

1
2
3
4
5
#以lamp用户登陆系统,并将用户 lamp 和 lamp1 加入group1群组。
[lamp@localhost ~]#gpasswd -a lamp group1
[lamp@localhost ~]#gpasswd -a lamp1 group1
[lamp@localhost ~]#grep "group1" /etc/group
group1:x:506:lamp,lamp1

修改用户主要组

要更改用户的主要组,请使用 usermod 命令的 -g 选项,后跟组名称和用户名。每个用户仅有一个主要组,零个或多个次要组。

因此,如果你修改用户的主要组,用户将会离开与用户名同名的主要组。如果你只是让用户加入组拥有相应权限,请将用户添加到次要组。

例如命令 sudo usermod -g developers myfreax 用户 myfreax 的主要组更改为developers

1
2
#sudo usermod -g GROUP USER
sudo usermod -g developers myfreax

修改用户信息

要更改 GECOS 或者用户的全名信息,请使用 -c 选项,后跟新的注释和用户名。此信息存储在/etc/passwd文件中。

GECOS 信息通常用于记录帐户或用户的一般信息,例如他们的真实姓名和电话号码,也可以是自定义的任何信息。

例如命令 sudo usermod -c "Test User" myfreax 将会修改用户 myfreax 的 GECOS 信息。

1
2
#usermod -c "GECOS Comment" USER
sudo usermod -c "Test User" myfreax

修改用户家目录

在大多数 Linux 系统上,用户家目录以用户的名称作为目录的名称,并将其存在目录 /home。

如果由于某种原因要更改用户的家目录。请使用 usermod 命令 -d 选项,后跟家目录的绝对路径和用户名。

默认情况下,usermod 命令不会将用户家目录的内容移至新的家目录。要移动家目录所有文件,请使用 -m 选项。如果新的家目录尚不存在,usermod 命令则会创建它。

例如命令 usermod -d /var/www www-data 会将 www-data 用户的家目录更改为/var/www

1
2
3
#usermod -d HOME_DIR USER
#usermod -d HOME_DIR -m USER
usermod -d /var/www www-data

修改用户默认登录 Shell

Shell 是 Linux/UNIX 操作系统的用户和计算机的交互接口。可以让用户直接输入命令来执行各种各样的任务。可以运行 cat 命令查看 /etc/shells 文件的内容,找到系统可用的Shell。

默认 Shell 程序是登录系统后运行的 Shell 程序。在大多数Linux系统,默认 Shell 设置为 Bash Shell。

要更改用户的默认 Shell 程序,请使用 usermod 命令的 -s 选项。后跟 Shell 程序的绝对路径和用户名。

例如命令 sudo usermod -s /usr/bin/zsh myfreax 修改用户 myfreax 的默认 Shell 为Zsh。

1
2
3
#usermod -s SHELL USER
cat /etc/shells
sudo usermod -s /usr/bin/zsh myfreax

usermod 命令修改用户UID

UID用户标识符是分配给每个用户的号码。 操作系统使用它来指代用户。要更改用户UID,使用-u选项调用usermod命令,后接新的UID和用户名。

在修改用户的UID时,usermod命令将会帮助你修改用户在家目录拥有所有权的文件,包括用户的邮箱文件。其他文件的所有权必须手动更改。

例如命令sudo usermod -u 1050 myfreax,将会修改myfreax用户的UID为1050。

1
2
#usermod -u UID USER
sudo usermod -u 1050 myfreax

修改用户名

尽管不是很经常,但有时您可能想要更改现有用户的名称。usermod 命令的 -l 选项允许你修改用户的名称。

在更改用户名时,您可能还希望修改用户的家目录名称以对应新的用户名变化。要修改用户家目录,请参考 usermod 命令更改用户家目录。

语法:

1
usermod -l NEW_USER USER

具体地, 使用 usermodgroupmod 实现用户名修订

1
2
3
4
5
6
7
8
9
# 将pi用户名修改成希望的名字,例如我使用myfreax来替换pi
usermod -l myfreax pi
usermod -d /home/myfreax -m myfreax
groupmod -n myfreax pi

# 将自己的帐号加入到免密码sudo用户
echo "myfreax ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/010_pi-nopasswd
# 千万不要忘记设置密码
passwd myfreax

参考连接

简单来说:

  • usermod -l new_username old_username 修改用户名(会同时修改 /etc/passwd/etc/group )
  • usermod -d /home/new_username -m new_username 修改用户目录名
  • usermod -u 2000 new_username 修改用户uid
  • groupmod -o -n new_groupname old_groupname 修改用户组名

设置用户有效期限

到期日期是禁用用户帐户的日期。要设置用户的到期日期,请使用 usemod 命令的 -e 选项。

到期日期必须使用格式 YYYY-MM-DD。要停止帐户的到期时间,请设置一个空的到期日期,表示永远不会到期。

如果你需要验证是否设置成功或者查看用户有效期,请运行命令 chage -l 命令查看用户的有效期。到期日期存储在 /etc/shadow 文件。

例如要在 2022-02-21 禁用用户 myfreax,请运行命令 sudo usermod -e "2022-02-21" myfreax

1
2
3
4
5
6
7
8
9
10
11
#sudo usermod -e DATE USER
$ sudo usermod -e "2022-02-21" myfreax
$ sudo usermod -e "" myfreax #永远不会过期
$ sudo chage -l myfreax
Last password change : Jul 24, 2018
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

锁定和解锁用户帐户

要锁定用户请使用 usermod 命令的 -L 选项,被锁定的用户将在加密密码的前面插入一个感叹号!。 要解锁用户,请使用 usermod 命令的 -U 选项。

/etc/shadow 文件中的密码字段包含感叹号时,用户将无法使用密码登录到系统。 但仍然允许使用其他登录方法。

例如基于密钥的身份验证或使用 su 命令切换用户。如果要锁定用户并禁用所有登录方法,则还需要将到期日期设置为 1。

例如命令 sudo usermod -L myfreax 将会锁定用户myfreax

1
2
#usermod -L USER
sudo usermod -L myfreax

命令 sudo usermod -L -e 1 myfreax 锁定 myfreax 用户并禁用所有登录方法。

1
sudo usermod -L -e 1 myfreax

命令 sudo usermod -U myfreax 解锁myfreax用户。

1
2
#usermod -U USER
sudo usermod -U myfreax

超级用户

默认情况下,在 Ubuntu,sudo 组的成员被授予 sudo 访问权限。如果您希望新创建的用户具有 sudo 权限,请将用户添加到 sudo 组

修改用户所属组的命令是 usermod 命令,我们不建议直接修改用户主要组。这可能导致某些权限问题。最好的方式将用户追加到 sudo 组中。

因此你将使用 usermod 命令的 -aG 选项,添加用户到 sudo 组,-a 表示追加用户到指定组,-G 选项表示不要将用户从其它组中移除。

1
sudo usermod -aG sudo username
  • usermod 更改用户的属性和权限;
  • -a 选项表示将用户追加到给定组,但是不将其从现有组中删除。如果没有 -a 选项,该用户将会被从其现有组中删除;
  • -G 选项列明要添加用户的组,在我们的例子中,它是 “sudo”。

验证 sudo 权限

现在,我们需要验证用户是否被赋予了 sudo 权限。这个验证的方式有很多,我们在这里使用如下命令:

1
sudo -l -U <username>

在上述命令的输出中,末尾你会看到是否可以 sudo 权限运行所有命令:(ALL : ALL) ALL,如下图所示:

或者,你也可以在命令行中切换到新用户中,然后尝试运行 sudo 命令,看是否成功。

这样,我们就创建了一个 sudo 权限的用户。

查看所有用户

查看 /etc/passwd 来查看系统中的用户

使用 less 查看 /etc/passwd 允许系统操作列出在本地存储的系统用户,它以结构化的方式输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
johndoe:x:1000:1000:John Doe,,,:/home/helder:/bin/bash
davmail:x:127:65534::/var/lib/davmail:/usr/sbin/nologin
statd:x:128:65534::/var/lib/nfs:/usr/sbin/nologin
/etc/passwd (END)

我们对上述输出做一个简单的整理:

  • 用户名(user name);
  • 加密的密码(Encrypted password,x 表示密码已经存储);
  • 用户ID(User ID, 即UID);
  • 用户组ID(GID);
  • 用户全名称;
  • 用户主目录;
  • 用户的登录shell(默认为 bash shell)。

为什么会有这么多用户呢?哪些是“真实的”?

上述命令输出的用户数量比我们预想的要多,因为它列出了所有的系统用户。可以参考用户标识符(UID)来区分普通用户和系统用户。

通常,普通用户的UID大于(或等于)1000,也就是说UID>=1000的用户为普通用户,UID<1000的用户为系统用户。

在上述输出中,我们还可以看到有些用户在行尾标注有 “nologin”,这表示这些用户无法登录系统,通常这些用户被称为“伪用户”。

使用 getent passwd 查看用户

这个命令的输出与 less /etc/passwd 类似,但它实际上查询 GNU名称服务交换功能配置文件(GUN Name Service Switch),该文件位于 /etc/nsswitch.conf

这个配置包含 passwd,所以他们的输出很类似。但是如果你使用 LDAP 进行身份验证,那么它的输出中会包含方法1 中的输出。

1
getent passwd

其输出如下图所示:

使用 compgen 查看用户

如果只想列出用户名(而不包含其他的附加信息),可以使用带有 -u 选项的 compgen 命令:

1
compgen -u

其输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ compgen -u
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
systemd-network
systemd-resolve
syslog
messagebus
_apt
uuidd
avahi-autoipd
usbmux
dnsmasq
rtkit
cups-pk-helper
speech-dispatcher
whoopsie
kernoops
saned
pulse
avahi
colord
hplip
geoclue
gnome-initial-setup
gdm

注:你可以使用 compgen 命令和 -c 选项列出所有可用的命令。如果你不是Linux系统的管理员并且没有sudo访问权限时,这将非常有用。

只列出用户名

我们知道使用 compgen 命令可以只列出用户名,但这不是唯一的方法。还可以使用 awk 命令或者 cut 命令来过滤前两种方法的输出来得到用户名:

1
cut -d: -f1 /etc/passwd

或者:

1
getent passwd | awk -F: '{ print $1}'

上述两个命令都可以为我们提供一个过滤后的用户名列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
root
daemon
bin
sys
sync
games
man
lp
mail
news
johndoe
davmail
statd

检查某个用户是否已存在于系统中

如果我们想要查看系统中是否存在某一个用户名,可以使用如下命令:

1
getent passwd | grep johndoe

输出如下:

1
johndoe:x:1000:1000:John Doe,,,:/home/johndoe:/bin/bash

列出所有在线用户

如果我们想要查看当前哪些用户已经登录到当前的 Linux 系统中,可以使用 who 命令,它将会列出当前已连接到系统中的用户名与其活动会话:

1
2
3
4
user@system:~$ who
johndoe :0 2019-01-28 21:35 (:0)
harrysmith pts/0 2019-02-01 09:51 (192.168.1.1)
stevejones pts/1 2019-02-02 09:51 (192.168.1.173)

上述输出不仅会列出已连接到系统的用户名,而且还会显示其是如何连接的,以及何时、从何处开始连接的。

  • 第一列即为用户名。
  • 第二列显示它的连接类型;如果是“:N”形式的,其中N是一个数字,那么表示是使用图形用户界面(GUI)或桌面会话,比如Gnome,XDE等;如果显示的是“pts/N”形式的,其中N是一个数字,则表示它是通过 ssh 协议(命令行)建立的连接。
  • 第三列显示其连接到系统的开始时间(日期和时间);
  • 第四列和最后一列显示连接的位置,如果是远程连接,它会显示进行连接的IP地址,如果是本地(如GUI),它会显示 “(:N)”,其中 N 是本列中的会话编号,与第二列中的编号相匹配。

用户组

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理(开发、测试、运维、root)。不同 Linux 系统对用户组的规定有所不同,如 Linux 下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对 /etc/group 文件的更新。

在 Linux,组用于组织和管理用户帐户。组的主要目的是为指定的资源定义权限并在组内用户之间共享权限。例如读取,写入或执行权限

添加用户组

使用 groupadd 命令创建组。只有root用户或具有 sudo 权限的用户才能创建组。

groupadd 命令

groupadd 命令的语法形式是 groupadd [OPTIONS] GROUPNAMEOPTIONS groupadd 命令的选项,GROUPNAME 组的名称。

当运行 groupadd 命令时,groupadd 命令将会根据指定的选项以及 /etc/login.defs 文件中指定的默认值创建组。

groupadd 命令创建组

要创建新的组,请运行 groupadd 命令,然后输入组的名称。命令创建组的记录并添加到文件 /etc/group/etc/gshadow

如果已经存在相同名称的组,终端将会打印错误消息 groupadd: group ‘mygroup’ already exists。

如果禁用错误消息的输出,请使用 -f / --force 选项强制创建组。groupadd -f mygroup 命令创建组 mygroup

1
2
groupadd mygroup
groupadd -f mygroup

groupadd 命令指定 GID 创建组

在 Linux/Unix 操作系统,组由其名称和唯一的 GID 标识。默认情况下,创建组时,系统会从 /etc/login.defs 文件确定下一个可用的 GID。

如果需要创建具有指定 GID 的组,请使用 groupadd 命令的 -g/--gid 选项创建组。

当指定 GID 的组已经存在时,groupadd 命令将会打印错误消息,groupadd: GID ‘1010’ already exists。

你也可以使用 groupadd 命令的 -o/--non-unique 选项,创建具有非唯一GID的组,但 Linux 系统管理员是很少这样做的。

例如groupadd -g 1010 mygroup将会创建mygroup并指定GID 1010。要验证组是否创建成功,可以运行命令列出所有组并使用grep命令过滤结果。

1
2
3
4
groupadd -g 1010 mygroup
#groupadd -o -g 1010 mygroup
getent group | grep mygroup
mygroup:x:1010:

groupadd 命令创建系统组

系统和普通组之间没有真正的区别。通常,系统组用于某些特殊的系统操作目的,例如创建备份或进行系统维护。

系统组的 GID 是从 /etc/login.defs 文件指定的ID范围选择,该范围不同于普通组的范围。要创建系统组请使用 groupadd 命令的-r/--system选项创建组。

例如命令 groupadd -r mysystemgroup 创建系统组 mysystemgroup

1
groupadd -r mysystemgroup

覆盖默认 /etc/login.defs 值

您也可以覆盖创建组时用于自动选择 GID 的最大值和最小值的范围,此值都可以为系统组和普通组指定。

groupadd 命令的 -K/--key 选项使您可以覆盖 /etc/login.defs 文件中指定的默认值。

假设您要创建 GID 是在 1200 至 1500 之间的组,在运行 groupadd 命令创建组时,请指定最小/最大值。

1
groupadd -K GID_MIN=1200 -K GID_MAX=1500 mygroup

groupadd 命令设置组密码

向组中添加密码没有实际用途,并且可能会导致安全问题,因为多个用户需要知道该密码。

如需要为组设置密码,可以使用 groupadd 命令的 -p/--password 选项,后跟组的密码,可让你为创建的组设置密码。

1
groupadd -p grouppassword mygroup

删除用户组

如果不再需要一个组,可以将其从 Linux 系统删除。

groupdel 命令

groupdel命令的语法形式是 groupdel [OPTIONS] GROUPNAMEOPTIONS 是 groupdel 命令的选项,可选参数。 GROUPNAME是您要删除的组名称。

只有 root 用户或具有 sudo 权限的用户才可以删除组。如果不先删除用户,则无法删除用户的主要组。

groupdel 命令仅接受很少使用的一些选项。命令选项的更多信息,请阅读 groupdel 手册页。

groupdel 命令删除组

要从 Linux 系统中删除指定的组,请运行 groupdel 命令,后跟组名称。

groupdel 命令将从 /etc/group/etc/gshadow 文件删除组的信息。成功后,groupdel 命令不会打印任何输出。

例如命令 groupdel mygroup 将会删除mygroup组,要来验证组是否已删除,可以运行命令 getent group 列出所有组

然后使用 grep 命令搜索 getent 命令的标准输出过滤结果。如果您要删除的群组不存在,则没有任何输出。

1
2
groupdel mygroup
getent group | grep mygroup

修改用户组的属性

使用 groupmod 命令

1
groupmod 选项 用户组

常用的选项有:

  • -g GID 为用户组指定新的组标识号。
  • -o-g 选项同时使用,用户组的新 GID 可以与系统已有用户组的 GID 相同。
  • -n 新用户组 将用户组的名字改为新名字
1
2
3
4
5
# 此命令将组group2的组标识号修改为102。
groupmod -g 102 group2

# 将组group2的标识号改为10000,组名修改为group3。
groupmod –g 10000 -n group3 group2

将用户添加进用户组

方法1方法2

Linux 列出组与成员

在Linux,组是用户的集合。组的主要目的是为指定资源定义一组权限。

例如读,写或执行权限,这些权限可以在组内的用户之间共享。可以将用户加入组,并授予组的权限。

用户可以拥有属于两种类型的组,分别是主要组和次要组。

通常,主要组的名称与用户的名称相同。每个用户拥有一个主要组。次要组用于向一组用户授予权限。次要组的成员可以是零个或多个。

列出所有组

有多种方法可以找出用户所属的组。用户主要组存储在/etc/passwd文件中,次要组在/etc/group文件中列出。

找到用户组的一种方法是查看这些文件的内容,你可使用catlessgrep命令查看两个文件的内容。

另一个更简单的选择是使用groups命令,groups命令的目的是提供系统用户和组的信息。

groups 命令列出所有组

列出用户所属的所有组的最常用的命令是groups。当不带任何参数运行groups命令时。

groups命令将打印当前登录用户所属的所有组。第一个是主要组,其它都是次要组。

如需要获取指定用户所属的组,请为groups命令提供用户名作为参数。同样第一个是用户的主要组,其它都是次要组。

1
2
3
groups
groups myfreax
myfreax adm cdrom sudo dip plugdev lpadmin sambashare

id 命令列出所有组

id命令显示指定用户及其所属组的信息。如果省略用户名,则会显示当前用户的信息。

要仅打印名称而不包含用户和组ID,请使用-n选项。 -g选项将仅打印主要组,-G选项将打印所有组。例如命令id -nG myfreax将打印当前用户所属的组的名称。

例如,要获取用户myfreax的信息,请运行命令id myfreax。命令将显示用户名uid,用户的主要组gid和用户的次要组groups

1
2
3
id myfreax
id -nG myfreax
uid=1001(myfreax) gid=1001(myfreax) groups=1001(myfreax),27(sudo)

列出组成员

要列出组的所有成员,请使用getent group命令,后跟组名称。如果该组存在,getent group命令将打印指定组名称及其所有成员。

例如,要查找developers组的成员,请运行命令getent group developers。如果没有输出,则表示该组不存在。

1
2
getent group developers
developers:x:126:frank,mary

列出所有组

要查看系统上存在的所有组,只需使用cat命令less命令查看/etc/group文件即可。该文件中的每一行代表一个组的信息。

另一个选择是使用getent命令,getent命令显示/etc/nsswitch.conf文件中的组数据记录,可用于查询所有组的数据。

如果要在/etc/group文件获取所有组,请运行命令less /etc/group。要使用getent命令获取所有组,请运行命令getent group

1
2
less /etc/group
getent group

输出与/etc/group文件内容相同。如果您使用LDAP进行用户身份验证,getent命令将显示/etc/group文件和LDAP数据库中的所有组。

您也可以使用awkcut只打印第一列,也就是仅打印组的名名称。

1
2
getent group | awk -F: '{ print $1}'
getent group | cut -d: -f1