一、Linux 多用户

1. 理解Linux系统可以有多个用户

Linux 允许使用者在 Linux 系统上通过规划不同类型、不同层级的用户,并公平地分配系统资源与工作环境。而与 Windows 系统最大的不同,在于 Linux 允许不同的用户同时登录主机,同时使用主机的资源,因此 Linux 被称为是多用户系统。

Linux是一个真实的、完整的多用户多任务操作系统,多用户多任务就是可以在系统上建立多个用户,而多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响,例如某台linux服务器上有4个用户,分别是root、www、ftp和mysql,在同一时间内,root用户可能在查看系统日志,管理维护系统,www用户可能在修改自己的网页程序,ftp用户可能在上传软件到服务器,mysql用户可能在执行自己的SQL查询,每个用户互不干扰,有条不紊的进行着自己的工作,而每个用户之间不能越权访问,比如www用户不能执行mysql用户的SQL查询操作,ftp用户也不能修改www用户的网页程序,因此可知,不同用户具有不同的权限,每个用户是在权限允许的范围内完成不同的任务,linux正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。

任何一个要使用系统资源的用户,都必须首先向系统管理员(root)申请一个账号,然后以这个账号的身份进入系统。

  1. 每个用户账号都拥有一个唯一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后,就能够进入系统和 自己的主目录

  2. 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;

  3. 另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

2. 用户管理

linux 是多用户系统,root 用户具有最高权限,只有 root 用户才能创建和删除用户(useradd and userdel),其他用户无此权限。

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

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

用户管理的具体操作参考:Linux 用户和用户组管理Linux用户和用户组管理详解

用户之间可以使用 su 命令进行切换。需要输入想切换到的用户的登陆密码。


二、用户分类

1. 用户类别

在linux下用户是根据角色定义的,具体分为三种角色:

  1. 超级用户:拥有对系统的最高管理权限,默认是root用户。
  2. 普通用户:只能对自己目录下的文件进行访问和修改,具有登录系统的权限,例如上面提到的www用户、ftp用户等。
  3. 虚拟用户:也叫“伪”用户,这类用户最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如系统默认的bin、adm、nobody用户等,一般运行的web服务,默认就是使用的nobody用户,但是nobody用户是不能登录系统的。

还有一种说法:

Linux系统上的用户分为两类:管理员用户(root)和普通用户。
其中,普通用户又分为两类:登录用户和系统用户。

不同的用户有不同的身份 / 权限:

  • 管理员用户:拥有对系统的最高管理权限
  • 登录用户:系统资源的正常使用者。
  • 系统用户:仅运行服务程序。

2. 用户组

相应地,Linux用户组分两类:管理员组和普通组。
其中,普通组又分为两类:系统组和登录组。

系统会把每个用户组用数字来标识,不同系统上数字标识可能不同。

组ID的范围:
管理员组:0
系统组:1-499、1-999
登录组:1000+

3. id 命令

id命令:可以查看当前登录用户所在的用户组。

可以通过执行命令id查看自己的组号:

wsl@xd:~$ id
uid=1006(wsl) gid=1006(wsl) groups=1006(wsl)

可以看到,我的uid是1006,gid是1006。
所以我是登陆组,属于登录用户。

查看其他人的id:

id 用户名

例:

首先,系统中都有谁可以通过/home目录查看:

wsl@xd:~$ cd ..         //从主目录/home/wsl退到/home
wsl@xd:/home$ cd ..     //从目录/home退到/
wsl@xd:/$ pwd
/
wsl@xd:/$ ls
bin   cdrom  etc   lib    lib64   lost+found  mnt  proc  run   snap  swapfile  tmp  var
boot  dev    home  lib32  libx32  media       opt  root  sbin  srv   sys       usr
wsl@xd:/$ cd home
wsl@xd:/home$ ls
chy  edward  hjt  jh  wqj  wsl  xd

查看其中一个用户 hjt 的 id :

wsl@xd:~$ id hjt
uid=1004(hjt) gid=1004(hjt) groups=1004(hjt),113(ssl-cert)

4. uid、gid

登陆 Linux 系统时,你虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名,它只认识与用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户名与 ID 的对应关系都存储在 /etc/passwd 文件中。

一般情况下,当登录Linux操作系统时,会先寻找/etc/passwd是否有输入账号,如果没有,则跳出,如果有,则读取对应的UID与GID,随后进入/etc/shadow核对密码,一切完成后,则进入shell管控。进入Linux系统之后,不认用户名,只认UID与GID。

Linux 系统中,每个用户的 ID 细分为 2 种,分别是用户 ID(User ID,简称UID)和组 ID(Group ID,简称GID),这与 文件拥有者拥有群组 两种属性相对应:

从上图可以看到,文件属性中显示的并不是uid和gid(数字),而是用户名和组名(root)。

在Linux系统中,每个文件都有自己的拥有者 ID 和群组 ID,当用户需要显示文件属性时,Linux系统会根据 /etc/passwd 和 /etc/group 文件中的内容,分别找到 UID 和 GID 所对应的用户名和群组名,然后显示出来。

在 /etc/passwd 文件中,利用 UID 可以找到对应的用户名;在 /etc/group 文件中,利用 GID 可以找到对应的群组名。

由此可见,UID与GID在日常的账户管理中,发挥着非常重要的作用,因为一不小心就可能访问不了自己的文件,所以温馨提示大家,不要随便改动自己的/etc/passwd与/etc/group文件。(使用root账号登录并执行命令vim /etc/passwd是可以更改文件内容的)

这两个文件的内容可以通过 cat 命令查看:(这两个文件对所有用户都是可读的)

cat /etc/passwd
cat /etc/group

只查看 /etc/passwd 文件中关于自己的内容:

cat /etc/passwd | grep 你的用户名

例子:

先查看/etc/passwd文件:

wsl@xd:~$ cat /etc/passwd | grep wsl
wsl:x:1006:1006::/home/wsl:/bin/bash
(用户名:口令:uid:gid:注释性描述:主目录:登录Shell)

其中,第一项是我的用户名(wsl),第三项(1006)和第四项(1006)分别是 我的 uid 和 gid 。

再查看/etc/group文件:

wsl@xd:~$ cat /etc/group | grep wsl
wsl:x:1006:
(组名:口令:gid:组内用户列表)

通过gid(1006),可知我的组名是wsl。


三、用户主目录

实际上,当你登录 linux 系统之后,就位于自己的主目录中。

1. Linux中,用户主目录(家目录)为:

对一般用户,~为/home/用户名
对于root用户,~为/root

如果要查看~的真实面貌(绝对路径),有两种方法:

  1. 可以先进入~目录,然后用pwd -P命令查看~的绝对路径:

    cd ~
    pwd -P
    
  2. 或者,用户的家目录可以在 /etc/passwd 中的第6项找到。
    /etc/passwd 文件的一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:

    用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
    

    查看我的/etc/passwd文件:

    wsl@xd:~$ cat /etc/passwd
    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
    uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
    irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
    gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
    nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
    systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
    systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
    systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
    messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
    syslog:x:104:110::/home/syslog:/usr/sbin/nologin
    _apt:x:105:65534::/nonexistent:/usr/sbin/nologin
    tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
    uuidd:x:107:114::/run/uuidd:/usr/sbin/nologin
    tcpdump:x:108:115::/nonexistent:/usr/sbin/nologin
    avahi-autoipd:x:109:116:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin
    usbmux:x:110:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
    rtkit:x:111:117:RealtimeKit,,,:/proc:/usr/sbin/nologin
    dnsmasq:x:112:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
    cups-pk-helper:x:113:120:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin
    speech-dispatcher:x:114:29:Speech Dispatcher,,,:/run/speech-dispatcher:/bin/false
    avahi:x:115:121:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
    kernoops:x:116:65534:Kernel Oops Tracking Daemon,,,:/:/usr/sbin/nologin
    saned:x:117:123::/var/lib/saned:/usr/sbin/nologin
    nm-openvpn:x:118:124:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
    hplip:x:119:7:HPLIP system user,,,:/run/hplip:/bin/false
    whoopsie:x:120:125::/nonexistent:/bin/false
    colord:x:121:126:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
    geoclue:x:122:127::/var/lib/geoclue:/usr/sbin/nologin
    pulse:x:123:128:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
    gnome-initial-setup:x:124:65534::/run/gnome-initial-setup/:/bin/false
    gdm:x:125:130:Gnome Display Manager:/var/lib/gdm3:/bin/false
    sssd:x:126:131:SSSD system user,,,:/var/lib/sss:/usr/sbin/nologin
    xd:x:1000:1000:xd,,,:/home/xd:/bin/bash
    systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
    lightdm:x:127:134:Light Display Manager:/var/lib/lightdm:/bin/false
    sshd:x:128:65534::/run/sshd:/usr/sbin/nologin
    chy:x:1001:1001::/home/chy:/usr/bin/fish
    edward:x:1002:1002::/home/edward:/usr/bin/fish
    glances:x:129:136::/var/lib/glances:/usr/sbin/nologin
    wqj:x:1003:1003::/home/wqj:/bin/sh
    hjt:x:1004:1004::/home/hjt:/bin/bash
    xrdp:x:130:137::/run/xrdp:/usr/sbin/nologin
    jh:x:1005:1005::/home/jh:/bin/bash
    nvidia-persistenced:x:131:138:NVIDIA Persistence Daemon,,,:/nonexistent:/usr/sbin/nologin
    wsl:x:1006:1006::/home/wsl:/bin/bash
    

    以上面为例,第一行, root 的家目录在 /root ,所以当 root 登陆之后,就会立刻跑到 /root 目录里头啦!
    我在最后一行,用户wsl,我的家目录是/home/wsl,所以我登陆系统之后,就位于自己的家目录中。
    例:
    我一进系统,就位于:wsl@xd:~$ ,其中的~说明我位于自己的主目录,可以通过pwd查看自己绝对路径:

    wsl@xd:~$ pwd
    /home/wsl
    

    我的主目录是/home/wsl

多一嘴:关于/etc/passwd文件

  1. 前面说过,/etc/passwd 文件的第二列是口令。
    但是我们从上述查看到的 /etc/passwd 内容里,观察到第二列都是x。这是为什么呢?

    解释:
    虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中, 有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。

  2. 第七列:登录Shell

    Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

    用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

    Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。

    系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。

    我的(最后一行wsl)该字段的值为 /bin/bash,说明我的Shell是bash。

    用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。
    利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

  3. 系统中有一类用户称为 伪用户(pseudo users)。
    这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。

    常见的伪用户如下所示:
    bin:拥有可执行的用户命令文件
    sys:拥有系统文件
    adm:拥有帐户文件
    uucp:UUCP使用
    lp:lp或lpd子系统使用
    nobody:NFS使用

    除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet等,它们也都各自为相关的进程和文件所需要。

    这些伪用户的登录 Shell 都是 nologin(好像还有false)。

2. 不同用户的主目录相互独立

(1)工作目录

从逻辑上讲,用户在登录到 Linux 系统中之后,每时每刻都处在某个目录之中,此目录被称做工作目录或当前目录(Working Directory)。工作目录是可以随时改变的。

用户初始登录到系统中时,其主目录(Home Directory)就成为其工作目录。

工作目录用“.”表示,其父目录用“..”表示。

(2)用户主目录

用户主目录是系统管理员增加用户时创建起来的(以后也可以改变),每个用户都有自己的主目录,不同用户的主目录一般互不相同。

用户刚登录到系统中时,其所在的工作目录便是该用户主目录,通常与用户的登录名相同。

用户可以通过一个~字符来引用自己的主目录。
例如,进入到主目录:

wsl@xd:~$ cd ~
wsl@xd:~$ pwd
/home/wsl

参考链接

  1. Linux系统用户和权限管理
  2. Linux 用户和用户组管理
  3. Linux UID和GID(用户ID和组ID)
  4. linux中用户的主目录~
  5. 操作系统-多用户如何理解(Linux)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐