说到用户管理,不得不先介绍一下linux和windows操作系统的区别。

我们平时使用windows系统,账号管理其实只有自己,自己打游戏、上网、学习、改密码等等,若账号名不是管理员admin,那么在安装软件的时候,可能提示一个管理员权限确认,总之一切都是那么的方便,因为你是一个人。

但是,对于初识linux系统的小白来说,一切都变得复杂了,多用户、做用户组、多任务,甚至是多个桌面,一下子升了一个维度。正因为系统本身设计的更复杂,作为linux的使用者也更加高效,并能充分利用计算机资源。最简单的例子,我们可以多个人同时登陆、同时操作,做各自的事情。

接下来,我们从用户概念、账号设置、权限管理、登录操作等方面进行讲解,一起深入学习linux系统的用户知识。

  • 用户和用户组
  • linux系统中对于账号而言,实际上就是ID,系统不关心名称本身,我们可以随便的起名字,只要不重复就可以。账号的列表存放在/etc/passwd下面:

    root@localhost [~] cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    我们选择其中的一行来看,比如root,一共有七段,每段都由分号分开,具体代表意义如下:

    root@localhost [~] head -n1 /etc/passwd | awk '{gsub(/:/,"\n");print}'
    root        #用户名称,代表用户,帐号名称不许重复
    x           #密码,用户登录时需要
    0           #用户ID,系统内部用于来识别不同的用户的
    0           #组ID,分组的唯一标识
    root        #描述信息,解释用户的相关信息,对系统操作没有用处
    /root       #用户根目录,登陆后默认进入的目录
    /bin/bash   #用户登陆shell,可查看操作命令集

    在这里需要注意几个知识点:
    1. 用户名称root是超级管理员,由系统直接设置。
    2. 由于系统中/etc/shadow专门存放密码,因此在这里会用字母“x”表示。若用户没有密码,则该字段为空;若是字符“*”,则表示该用户被查封,无法登陆。
    3. 用户ID0代表系统管理员。如果我们创建了一个新用户,并将此字段设置为0,则该用户有管理员权限。
    4. root的用户根目录是/root,其余账号的根目录在/home/username下面。

  • 密码管理
  • 最初,用户的密码是直接存放在passwd文件中的,并且密码是被加过密的。但是,对于passwd文件任何用户都是可以进行查看的(可读的),而随着技术发展加密算法变得可被破解,最终导致了极大的安全隐患。

    后来,使用专门的一个文件存储用户的密码,既保证了普通用户查看passwd的文件权限,有避免了密码数据被泄露。存放密码的文件是/etc/shadow,该文件只有系统管理员才能看到。

    那么,我们来看一下这个文件:

    root@localhost [~] cat /etc/shadow
    root:$6$E1XEwUOf$.LHgImaeOwBqEIGd8S7kGJMRylUftAt/RwXJHaMz7mjn2FM9Zr52m0R.eYhYwGx1LYR4HYxSWzk7FgxhA.OPO0:16288:0:99999:7:::
    bin:*:15240:0:99999:7:::
    daemon:*:15240:0:99999:7:::
    adm:*:15240:0:99999:7:::
    lp:*:15240:0:99999:7:::
    sync:*:15240:0:99999:7:::
    shutdown:*:15240:0:99999:7:::
    halt:*:15240:0:99999:7:::
    mail:*:15240:0:99999:7:::
    uucp:*:15240:0:99999:7:::

    我们选择其中的一行来看,比如root,一共有九段,每段都由分号分开,具体代表意义如下:

    root@localhost [~] head -n1 /etc/shadow | awk '{gsub(/:/,"\n");print}'
    root        #用户名称,同/etc/shadow
    $6$E1X****  #用户密码,加过密的密码(原始密码六个1)
    16288       #上次改动密码的日期,按照unix时间戳为起始日期(1970年1月1日),1971年1月1日即为366
    0           #密码不可被改动的天数,设置后要经过该天数后才可更改密码
    99999       #密码在规定天数内必须更改,99999可以理解为永不更改
    7           #密码变更期限提醒,默认设置为提前7天提醒用户即将到期
                #账号失效期,超过此时间未修改密码,账号将暂时失效
                #账号取消时间,超过此时间后,账号无法使用
                #保留字段,暂时没有用处

    在这里需要注意几个知识点:
    1. 密码字段,第一个字符为“!”表示该用户被禁用,为“*”表示该用户不可以登录,前两个字符为“!!”表示禁用(一般创建完未设置密码时使用),为空表示登录时不需要密码。
    2. 一般收费服务商,会通过设置账号取消时间字段,来实现用户收费使用的时间标准。
    3. 密码在规定时间内未做修改而导致无法登陆,需要找管理员修改。

  • 用户组
  • 我们为什么需要用户组,假设这样一个场景,有多个人在同一台机器做A事情,有另一波人也在这台机器做B事情,做A和B事情时大家需要的权限各不相同。我们知道,linux系统中可以为每个用户设置不同的权限,若我们要分别对所有用户设置相应的权限,那么问题来了,若A小组需要修改某个权限,我们要一个个分别做修改,效率非常低效;而且,每次新添加一个成员,也要重新设置相应的权限。

    基于以上的种种问题,linux系统提供了用户组这个概念:


    用户组是权限的容器,用户组下的所有用户,可以继承所在组的权限

    用户组存储在/etc/group下面,那么,我们来看一下这个文件:

    root@localhost [~] cat /etc/group
    root:x:0:
    bin:x:1:bin,daemon
    daemon:x:2:bin,daemon
    sys:x:3:bin,adm
    adm:x:4:adm,daemon
    tty:x:5:
    disk:x:6:
    lp:x:7:daemon
    mem:x:8:

    我们选择其中的一行来看,比如bin,一共有四段,每段都由分号分开,具体代表意义如下:

    root@localhost [~] head -n2 /etc/group | tail -n1 | awk '{gsub(/:/,"\n");print}'
    bin         #群组名称,群识别标志
    x           #群组密码
    1           #组ID,系统识别群的唯一标识
    bin,daemon  #群组下的账号列表

    在这里需要注意几个知识点:
    1. 群组密码我们平时很少使用,只有在需要用群组登陆时才会设置。该密码也保存在/etc/shadow中。
    2. 如果在root组里面,将某个用户名加入到账号列表字段中,则该账号的组就变成了root。

  • 用户管理
  • 接下来,我们介绍用户管理相关的操作。刚才看到的几个文件都和用户相关,因此我们可以通过修改这几个文件的内容,来实现用户管理的操作。


    但是,在没有特殊的要求下,我们一定要避免直接操作修改这些文件/etc/passwd、/etc/shadow、/etc/group。一旦改坏了,用户系统就会出现各种问题,甚至无法登陆。

    那么,linux系统都有哪些常用的指令呢?


    adduser 添加用户
    passwd 修改密码。
    chfn 修改用户资料。
    chsh 更改用户的shell
    chmod 更改用户的权限
    chown 更改所有者
    chgrp 更改用户组
    sudo 临时提升为root权限
    who 显示当前谁在使用
    whoami 显示自己是谁

    我们通过举例,来深入了解这些命令。

    首先创建一个账号,用到adduser指令,该指令常用参数如下。
    useradd [options] username
    options:
    1.-u :指定UID
    2.-g :指定GID
    3.-d :指定用户目录,默认是/home/username
    4.-s :指定用户所在的shell环境

    设置密码用到passwd指令,后面加用户名即可。

    #创建一个mytest账号
    #账号目录在/opt/testfolder下
    #指定账号id为1234
    #组权限为root
    root@localhost [~] useradd -u1234 -groot -d/opt/testfolder mytest
    #查看创建用户的相关信息
    root@localhost [~] grep mytest /etc/passwd
    mytest:x:1234:0::/opt/testfolder:/bin/bash
    #自动创建了testfolder目录
    root@localhost [~] ls -l /opt/testfolder/
    total 0
    #刚创建完用户,密码为'!!',表示被禁用
    root@localhost [~] grep mytest /etc/shadow
    mytest:!!:16514:0:99999:7:::
    #设置密码
    root@localhost [~] passwd mytest
    Changing password for user mytest.
    New password:
    Retype new password:
    passwd: all authentication tokens updated successfully.
    #设置后再看,账号禁用已被取消
    root@localhost [~] grep mytest /etc/shadow
    mytest:$6$dk71Vi/2$Rg.YGkUZVQbGbXj5AMJWhkGd91GLFxIWvvYBNj/.Gj1jzltbK.pQpTo8KlZjawAOugCUYxQiL27SYgNpQ2nSy/:16514:0:99999:7:::

    至此,mytest账号创建完毕。

    登陆mytest账号,我们可以修改个人信息,指令是chfn,该指令常用参数如下。
    chfn [options]
    options:
    1.-f :设置真实姓名
    2.-h :设置家庭电话号码
    3.-o :设置办公室的地址
    4.-p :设置办公室的电话号码

    若不指定任何参数,则chfn指令会进入问答式界面。

    mytest@localhost [~] chfn
    Changing finger information for mytest.
    Password:
    Name []: ranshy
    Office []: 夏之冰雪工作室
    Office Phone []: 88888888
    Home Phone []: 66666666

    Finger information changed.
    #查看修改后的信息
    mytest@localhost [~] grep mytest /etc/passwd
    mytest:x:1234:0:ranshy,夏之冰雪工作室,88888888,66666666:/opt/testfolder:/bin/bash

    更改使用者的shell路径,指令是chsh,该指令常用参数如下。
    chsh [options]
    options:
    1.-l :列出系统目前所有的shell
    2.-s :修改自己的shell

    root@localhost [~] chsh -l
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/dash
    #修改mytest的bash
    root@localhost [~] chsh -s /bin/sh mytest
    Changing shell for mytest.
    Shell changed.
    #再次查看mytest信息,bash目录已经变化
    root@localhost [~] grep mytest /etc/passwd
    mytest:x:1234:0:ranshy,夏之冰雪工作室,88888888,66666666:/opt/testfolder:/bin/sh
  • 权限管理
  • linux系统下的所有文件,对不同用户都是有不同权限的,而控制用户权限的是chmod指令。介绍chmod指令前,我们首先了解下文件和目录的相关权限。

    mytest@localhost [~] mkdir folder
    mytest@localhost [~] touch file
    mytest@localhost [~] ls -l
    total 4
    -rw-r--r--. 1 mytest root    0 Mar 20 14:09 file
    drwxr-xr-x. 2 mytest root 4096 Mar 20 14:09 folder

    这里,我们用mytest分别创建了一个文件和一个目录,通过ls -l指令我们可以看到他们的详细信息,这些信息一共有九个,我们以folder为例,具体描述如下:

    mytest@localhost [~] ls -l | tail -n1 | awk '{gsub(/ /,"\n");print}'
    drwxr-xr-x.  #文件类型和文件权限,第一个字符是文件的类型标志,后9个为权限标志
    2            #硬链接数
    mytest       #文件或目录的拥有者
    root         #文件或目录所属的分组
    4096         #文件或目录的大小
    Mar          #创建月
    20           #创建日
    14:09        #创建具体时间
    folder       #文件或目录的创建名称

    在这里,重点讲解文件类型以及权限,需要注意几个知识点:
    1. 第一个字符代表文件类型,“-”表示普通文件,“d”表示目录,“b”表示块设备文件,“c”为字符设备文件,“l”表示文件链接。
    2. linux文件权限有三种,即可读、可写、可执行,对应的就是rwx,没有权限则用字符“-”标识,对于目录而言可执行代表可以cd进入。
    3. 而文件权限的又分为三组,因此这里由九个字符组成rwxr-xr-x,红色为文件拥有者权限,绿色为文件所属用户组的权限,黄色代表其它用户的权限,root拥有所有文件拥有者的权限。
    4. 文件权限采用八进制设计,各个权限的值代表的数字为r(4)、w(2)、x(1)、-(0),例如folder目录权限rwxr-xr-x对应的数字为755。

    理解了权限相关知识,我们开始真正学习chmod指令,chmod指令可以改变文件的权限,在安全隐私等方面都有很大的用途。

    chmod指令非常简单,可以直接配合之前所说的八进制,来修改具体的文件或文件夹。

    mytest@localhost [~] ls -l
    total 4
    -rw-r--r--. 1 mytest root    0 Mar 20 14:09 file
    drwxr-xr-x. 2 mytest root 4096 Mar 20 14:09 folder
    #修改文件权限为755
    mytest@localhost [~] chmod 755 file
    #若想修改目录以及子目录,需要加-R进行递归
    mytest@localhost [~] chmod -R 777 file
    mytest@localhost [~] ls -l
    total 4
    -rwxr-xr-x. 1 mytest root    0 Mar 20 14:09 file
    drwxrwxrwx. 2 mytest root 4096 Mar 20 14:09 folder

    当然,我们也可以直接使用字符r、w、x来进行权限修改,使用u表示修改所有者权限,使用g表示修改组权限,其它用户(other)使用o来表示,而所有人(all)使用a来表示。使用“+”来表示添加权限,“-”表示减少权限,“=”表示授予权限。

    #给文件的拥有者添加执行权限
    mytest@localhost [~] chmod u+x file
    #给组和其它用户减去读权限
    mytest@localhost [~] chmod go-r file
    #文件对所有人拒绝访问
    mytest@localhost [~] chmod a-rwx file
    #文件对其他人仅只读
    mytest@localhost [~] chmod o=r file

    更改文件的所属对象,指令是chown,该指令常用参数如下。
    chown [options] user:group file/folder
    options:
    1.-R :递归执行,修改对象为目录时,子目录同样被修改

    root@localhost [~] ls -l
    total 4
    -rw-r--r--. 1 mytest root    0 Mar 20 14:09 file
    drwxr-xr-x. 2 mytest root 4096 Mar 20 14:09 folder
    #修改文件的用户为root,组为nobody
    mytest@localhost [~] chown root:nobody file
    #修改目录的组为nobody
    root@localhost [~] chmod :nobody folder
    root@localhost [~] ls -l
    total 4
    -rw-r--r--. 1 root nobody    0 Mar 20 14:09 file
    drwxr-xr-x. 2 mytest nobody 4096 Mar 20 14:09 folder

    chgrp指令为修改文件或文件夹的所属组,比chown指令更灵活一下。但是,一般情况下,我们只需要使用chown命令即可完成组更改的任务。
  • 账号操作
  • 查看当前用户名,使用whoami指令。

    root@localhost [~] whoami
    root

    查看当前谁在登陆当前系统,使用who指令。

    root@localhost [~] who
    root     pts/0        2015-03-22 09:21 (222.70.230.236)
    mytest   pts/1        2015-03-22 10:29 (222.70.230.236)

    sudo指令可以临时使用root权限,一般使用一般用户登陆,而需要以管理员身份临时操作时使用。

    mytest@localhost [~] sudo yum install ***

    切换账号,使用su指令。

    #注意,这里输入的密码是root的密码,而非当前用户的密码。
    mytest@localhost [~] su root
    Password:
    root@localhost [~] whoami
    root

    提高linux服务器的账号安全级别,我们通常是禁止root账号直接远程连接(如ssh),而仅提供普通用户连接权限。普通用户连接后,再通过切换账号来获得root权限。

    禁止root远程连接的方法,是通过修改/etc/ssh/sshd_config文件来实现,千万注意不是/etc/ssh/ssh_config文件。文件查找“#PermitRootLogin yes”,将前面的“#”去掉,短尾“Yes”改为“No”,并保存文件,重启sshd即可。

    UseDNS no
    AddressFamily inet
    PermitRootLogin no
    root@localhost [~] service sshd restart
    Stopping sshd: [  OK  ]
    Starting sshd: [  OK  ]

    对于su指令,还有一个sudo的指令,该指令可以不需要关心具体的管理员名称和管理员密码,直接升级为管理员。这种用户需要授予其权限,才能执行sudo指令。

    赋予一个用户root权限,有多种方法,这里介绍一种最常用的、推荐的方法。修改/etc/sudoers文件,找到root设置那一行,在下面添加类似内容,保存即可。若加入NOPASSWD,则切换管理员时不需要密码。

    ## Allow root to run any commands anywhere
    root    ALL=(ALL)       ALL
    ranshy  ALL=(ALL)       ALL
    mytest@localhost [~] sudo su
    Password:
    root@localhost [~] whoami
    root
    root@localhost [~] exit
    exit
    #增加NOPASSWD选项,不需要输入密码
    mytest@localhost [~] vi /etc/sudoers
    ## Allow root to run any commands anywhere
    root    ALL=(ALL)       ALL
    ranshy  ALL=(ALL)       NOPASSWD: ALL
    mytest@localhost [~] sudo su
    root@localhost [~] whoami
    root

    另外还有几种授权普通用户为root的方法,比如修改/etc/passwd文件把用户ID修改为0。

    至此,linux系统用户相关知识,总结就到这里。