• Linux之(5)账户和shell基础知识


    Linux之(5)账户和shell基础知识

    Author:onceday date:2022年8月23日

    漫漫长路,而今才刚刚开始…

    本内容主要收集整理于:

    • 《Linux命令行与shell脚本编程大全》
    • 《鸟哥的linux私房菜》

    本内容基于ubuntu >= 20.04系统。

    1.引言

    shell是一种CLI,即command line interface,文本命令行界面。

    它有图形化的模拟界面,也有模拟终端的形式,界面大小是经典的80x24(字符宽度)。

    在linux发行版本里面,如ubuntu和centos,在图形化的桌面环境下,也可以进入终端模式。

    即:Ctrl + Alt + F1-F7切换不同的终端,具体需要根据Linux版本确定。

    终端的背景色、前景色等可以通过setterm指令来更改,但目前环境下使用较少,直接安装漂亮的终端美化工具即可获得炫酷的效果。

    Linux是一个很复杂的系统,而shell是一个最基本的打交道的地方,就像钓鱼一样,哪怕成为全国大师,依然要绑钩调漂。

    这是最基础的知识,非常杂乱,但是关键时刻又很有用。

    比如修改主机名,一般命令行显示的主机名字都过于机械了,因此可通过以下命令修改:

    hostname new-name
    
    • 1

    然后重启shell终端,便可以看到新的主机名字的了,但是当linux重启之后,便会失效。可以通过文件修改静态主机名。位于/etc/hostname,需要root权限操作。

    通过/etc/shells可以查看当前支持的shell种类:

    onceday@ubuntu:~$ cat /etc/shells 
    # /etc/shells: valid login shells
    /bin/sh
    /bin/bash
    /usr/bin/bash
    /bin/rbash
    /usr/bin/rbash
    /bin/dash
    /usr/bin/dash
    /usr/bin/tmux
    /usr/bin/screen
    /bin/zsh
    /usr/bin/zsh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    2.获取shell的账户信息

    当我们登入终端时,Linux系统根据/etc/passwd文件里面的信息来确定使用哪一种shell。

    shell类型很多,比如常见的bash、sh、zsh等,当然,这些shell基本是兼容的。

    这个文件,字面意思是存储密码信息,但现在已经不用它存储了,密码信息加密放在/etc/shadow里。

    所以passwd里面现在存放了一堆账户信息,比如UID,GID,主目录,默认使用的shell等。

    如下所示:

    onceday@LAPTOP-JUN9BRPR:~$ 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
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    .......
    onceday:x:1000:1000:,,,:/home/onceday:/bin/bash
    .......
    once:x:1001:1002:onceday,4-1,142511422,142452211,none:/home/once:/bin/sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    中间省略了很多账号信息,这些账号是系统服务和应用使用的账号,典型如网页服务器,www服务,它们不能工作在root模式下,这样太不安全了,因此需要一个系统服务账号,这些账号的UID一般从较小开始分配,因此用户的UID可以分配大一些,避免与它们重复。

    这些冒号分割的段信息如下:

    once :x  :1001   :1002    :onceday,4-1,142511422,142452211,none:/home/once :/bin/sh
    用户名:密码:User ID:Group ID:账户的文本描述性信息                    :主(home)目录:默认shell
    
    • 1
    • 2

    因为passwd文件已经不再存储密码信息了,所以都用x代替了。

    再来看一看etc/shadow文件的内容:

    root:$6$B.1YKsef······JGcchK.:18859:0:99999:7:::
    daemon:*:18781:0:99999:7:::
    bin:*:18781:0:99999:7:::
    sys:*:18781:0:99999:7:::
    onceday:$6$Brt······p7QngL0:18859:0:99999:7:::
    once:   :19224:   :0  :99999:7  :   :   :
    [1] :[2]:[3]  :[4]:[5]:[6]  :[7]:[8]:[9]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • [1]为用户名,对应passwd的用户名。
    • [2]为密码,是加密之后的密码。
    • [3]为最近一次修改密码的时间,是天数,从1970-01-01开始算起。
    • [4]限制改密码的时间,必须要经过该天数之后才能改密码。
    • [5]要求多少天之后必须改密码。
    • [6]表名在密码过期前多少天提醒用户改密码。
    • [7]密码过期多少天禁用用户账户。
    • [8]用户账户被禁用的日期,是天数,从1970-01-01开始算起。
    • [9]保留字段。
    3.修改用户账号信息

    如果这些命令无法访问,可能是/sbin,或者/usr/sbin不在PATH里面,通过$PATH可以查看当前路径.

    3.1 添加新用户,useradd

    这个添加新用户的命令非常快捷,可以一次性创建新用户账户及设置用户HOME目录

    该命令使用系统默认值来创建账户。

    onceday@ubuntu:~$ useradd -D
    GROUP=100
    HOME=/home
    INACTIVE=-1
    EXPIRE=
    SHELL=/bin/sh       
    SKEL=/etc/skel      
    CREATE_MAIL_SPOOL=no
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这些默认的含义大概是:默认加入GID为100的公共组,主目录在/home/username下,主目录默认模板为/etc/skel,账户密码过期后不会被禁用,账户没有设置过期日期,不自动在mail下创建接收邮件的文件。

    实际情况有所不同,比如默认GID一般不是100了,而是自动增加的一个数字,主目录也不会自动创建。

    因此可以使用以下的命令来创建:

    sudo useradd -m username
    sudo useradd -m -s shell-path username
    sudo useradd -m -u uid username
    
    • 1
    • 2
    • 3

    参数很多,可以直接看帮助文档,这个还是比较好理解的。

    默认参数可以在命令行改动,也可以在/etc/default/useradd文件里直接修改。

    3.2 删除用户,userdel

    userdel可以从系统中删除用户,它只会删除\etc\passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。

    可以通过以下两个命令来删除额外的文件:

    userdel -r username
    userdel -fr username
    
    • 1
    • 2

    这命令会移除home下的文件,-f是强行移除,即使文件可能不属于准备删除的用户。

    3.3 修改用户信息

    常见有以下工具可修改:

    命令描述
    usermod修改用户账户的字段,指定相关组的从属关系
    passwd修改已有用户的密码
    chpasswd从文件中读取登录名密码对,并更新密码
    chage修改密码过期日期
    chfn修改用户账户的备注信息
    chsh修改用户账户的默认登入shell
    finger查看用户信息
    id查询账号所属的UID和GID信息
    pwck检查/etc/passwd文件的配置信息
    pwconv将/etc/passwd内的账号密码信息移到/etc/shadow内
    pwunconv将/etc/shadow内的账号密码信息移到/etc/passwd内,会删除/etc/shadow

    usermod十分强大,可以修改大多数/etc/passwd/etc/shadow里面的字段,可以通过它的帮助文档来使用。

    此外usermod还可以锁定可解锁账户,如:

    usermod -L username #锁定账户,然后就无法登入
    usermod -U username #解锁账户,然后就可以登入
    
    • 1
    • 2

    passwd可以修改密码,每个用户可以修改自己的密码,这和passwd的特殊权限SUID有关,任何用户执行它时将具有暂时修改/etc/passwd的权限,即root权限。

    passwd [username]
    
    • 1

    使用chpasswd可以修改大量用户的密码,即它可以从文本读入userid:passwd的密码对:

    chpasswd < users.txt
    
    • 1

    此外finger也可以用于查看用户账号的具体信息。

    finger username
    
    • 1
    4.修改用户组信息

    组权限允许多个用户对系统中的对象共享一组共用的权限。

    组信息保存在系统的一个文件上,即/etc/group中。

    onceday@ubuntu:~$ cat //etc/group
    root:x:0:
    daemon:x:1:
    bin:x:2:
    sys:x:3:
    adm:x:4:syslog,onceday
    tty:x:5:syslog
    disk:x:6:
    lp  :x    :7  :
    组名 :组密码:GID:属于该组的用户列表
    ........
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    组密码允许非组内成员通过它成为该组成员,功能不是普遍使用,组密码位于/etc/gshadow中。

    onceday@LAPTOP-JUN9BRPR:~$ sudo cat /etc/gshadow
    root:*::
    daemon:*::
    bin:*::
    sys:*::
    adm:*::syslog,onceday
    tty:*::syslog
    组名:密码:用户组管理员的账号:加入该用户组支持的所属账号
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意,这个用户组管理员账号,可以管理该组,比如是否加入某个用户到该组中。

    要添加用户到一个组内,需要通过usermod命令,不能通过直接修改/etc/group文件来操作。

    需要注意的是:当一个用户账号在/etc/group文件中指定了默认组时,该用户账号不会再作为该组成员出现在/etc/group文件中。

    4.1 groupadd创建新组
    onceday@ubuntu:~$ groupadd --help
    Usage: groupadd [options] GROUP
    
    Options:
      -f, --force                   exit successfully if the group already exists,
                                    and cancel -g if the GID is already used
      -g, --gid GID                 use GID for the new group
      -h, --help                    display this help message and exit
      -K, --key KEY=VALUE           override /etc/login.defs defaults
      -o, --non-unique              allow to create groups with duplicate
                                    (non-unique) GID
      -p, --password PASSWORD       use this encrypted password for the new group
      -r, --system                  create a system account
      -R, --root CHROOT_DIR         directory to chroot into
      -P, --prefix PREFIX_DIR       directory prefix
          --extrausers              Use the extra users database
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    可以看到,直接使用groupadd groupname即可创建新组了,但是不存在创建时指定组员的命令,需要通过usermod命令手动添加。

    此外,-r可指定创建系统账户,以及-g指定GID和-p指定密码等。

    当更改了账户所需的信息后,已登入账号需要重新登入后才能生效。

    4.2 修改组groupmod
    onceday@ubuntu:~$ groupmod
    Usage: groupmod [options] GROUP
    
    Options:
      -g, --gid GID                 change the group ID to GID
      -h, --help                    display this help message and exit
      -n, --new-name NEW_GROUP      change the name to NEW_GROUP
      -o, --non-unique              allow to use a duplicate (non-unique) GID
      -p, --password PASSWORD       change the password to this (encrypted)
                                    PASSWORD
      -R, --root CHROOT_DIR         directory to chroot into
      -P, --prefix PREFIX_DIR       prefix directory where are located the /etc/* files
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可以更改GID,name,密码,和所属的文件夹。

    4.3 下面的是一些常见的其他命令
    命令描述
    groupdel删除用户组,注意无法直接删除初始用户组
    gpasswd指定某个用户为某个组的管理员
    5.额外信息
    5.1 保存账号信息

    登入账号的时候,Linux会读取/etc/passwd/etc/group/etc/shadow/etc/gshadow里面的账号和密码信息,因此,如果要保存当前的账号信息,一定要把这三个文件都备份下来。

    需要注意它的权限必须符合以下规则:

    onceday@ubuntu:~$ ll /etc/passwd
    -rw-r--r-- 1 root root 3013 Sep 10 17:19 /etc/passwd
    onceday@ubuntu:~$ ll /etc/shadow
    -rw-r----- 1 root shadow 1683 Aug 29 21:52 /etc/shadow
    onceday@ubuntu:~$ ll /etc/group
    -rw-r--r-- 1 root root 1171 Aug 29 21:52 /etc/group
    onceday@ubuntu:~$ ll /etc/gshadow
    -rw-r----- 1 root shadow 974 Aug 29 21:52 /etc/gshadow
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    5.2 忘记密码如何做?

    对于普通用户,需要使用root账户来修改密码,直接passwd name即可。

    对于root用户,那么需要直接清除/etc/shadow里面密码即可,例如:

    • 进入单人维护模式,此时系统会主动给与root权限的bash接口
    • 启动其他的linux系统,挂载/etc/shadow所在的文件系统,然后清除对应密码即可。
    5.3 初始用户组initial groupeffective group

    /etc/passwd里面账户信息里,会有一个GID,该GID所对应的用户组,即是该账号的初始用户组,初始用户组对应的账号不会在/etc/group里面记录,这是新版Linux的特征。

    当用户一登入时,立马会拥有该用户组的相关权限。

    但是可以通过usermod指令,为user添加多个组,如:

    usermod -a -G user-groups user
    
    • 1

    -a表示扩增用户组,-G表示次要用户组,这样就可以添加多个用户组到一个用户上。

    可直接在命令行输入groups来获取当前账户的全部用户组信息。

    onceday@ubuntu:~$ groups
    OD adm dialout cdrom floppy sudo audio dip video plugdev netdev docker
    
    • 1
    • 2

    第一个OD是初始用户组,即/etc/passwd里面对应UID的用户组。

    同时第一个输出的用户组OD也是有效用户组,因此新建文件默认的组是OD组。

    可使用newgrp命令来切换有效用户组,该命令切换的用户组必须是groups里面输出组其中一个。

    该命令是通过重新开一个shell实现用户组切换的。

    6.访问控制列表ACL

    ACL是Acess Control List的缩写,用于提供详细的权限设置。

    可以针对单一用户、单一文件或目录进行r、w、x的权限设置。

    首先可以检查系统是否支持ACL属性,使用以下命令行:

    dmesg |grep -i acl
    
    • 1
    6.1 获取ACL设置选项

    使用命令getfacl:

    onceday@ubuntu:~$ getfacl .
    # file: .
    # owner: onceday
    # group: OD
    user::rwx
    group::r-x
    other::r-x
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    onceday@ubuntu:~$ getfacl --help
    getfacl 2.2.53 -- get file access control lists
    Usage: getfacl [-aceEsRLPtpndvh] file ...
      -a,  --access           display the file access control list only
      -d, --default           display the default access control list only
      -c, --omit-header       do not display the comment header
      -e, --all-effective     print all effective rights
      -E, --no-effective      print no effective rights
      -s, --skip-base         skip files that only have the base entries
      -R, --recursive         recurse into subdirectories
      -L, --logical           logical walk, follow symbolic links
      -P, --physical          physical walk, do not follow symbolic links
      -t, --tabular           use tabular output format
      -n, --numeric           print numeric user/group identifiers
      -p, --absolute-names    don't strip leading '/' in pathnames
      -v, --version           print version and exit
      -h, --help              this help text
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    6.2 设置acl权限
    setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名 
    
    • 1
    • -m设置后续的ACL参数给文件使用,不可与-x合用
    • -x删除后续的ACL参数,不可与-m合用
    • -b删除所有的ACL设置参数
    • -k删除默认的ACL参数
    • -R递归设置ACL,即包括子目录都会设置起来
    • -d设置默认ACL参数的意思,只对目录有效。

    1.对单一用户设置权限:

    set -m u::rwx filename
    
    • 1

    此时查看该文件权限,可能会额外多出来一些权限,如:

    onceday@ubuntu:~$ setfacl -m u:chenguang:rw hello.c
    onceday@ubuntu:~$ ll hello.c
    -rw-rw-r--+ 1 onceday OD 135 Oct 12  2021 hello.c
    onceday@ubuntu:~$ getfacl hello.c
    # file: hello.c
    # owner: onceday
    # group: OD
    user::rw-
    user:chenguang:rw-
    group::r--
    mask::rw-
    other::r--
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.对用户组设置权限如下:

    setfacl -m g:mygroup1:rx filename
    
    • 1

    3.设置有效权限(mask对应的权限):

    setfacl -m m:rwx filename
    
    • 1

    需要注意: 用户组或用户所设置的权限必须要存在于mask的权限范围内才会生效

    4.使用默认权限设置目录未来文件的ACl权限继承

    setfacl -m d:u:myuser1:rx directory #设置用户默认继承权限
    setfacl -m d:g:mygroup1:rx directory #设置用户组默认继承权限 
    
    • 1
    • 2

    取消上面设置的这些权限,也要经过setfacl -b命令就可以了

    在设置无任何权限的ACL语法中,权限的字段不可以留白,应该如下:

    setfacl -m u:xxx:- filename
    
    • 1
    7.用户身份切换
    7.1 切换登入账号

    使用su命令

    su user #代表直接切换到user
    su -  user #代表使用login-shell的变量文件读取方式登入系统
    
    • 1
    • 2

    直接使用su切换到root用户,会有很多变量没有重新设置,因此最好使用su -的切换方式。

    su -m/-p 表示使用目前的环境设置,而不读取新使用者的配置文件。

    su -c表示仅执行一次命令。

    7.2 sudo命令

    该sudo的执行权限需要在创建账户的时候指定为system account才行。

    也可以在/etc/sudoers文件处修改添加。

    用法如下:

    sudo [-b] [-u username] .......
    
    • 1

    -b表示是否放在后台中让系统自动执行,不与当前的shell产生影响。

    -u后面可以接准备切换的使用者,无此项代表切换为root。

    该命令需要通过visudo来修改,实际上普通文本编辑也可以。

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    onceday ALL=(ALL) NOPASSWD: ALL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    对于第一个行的各字段含义如下:

    root    	           ALL=(ALL:ALL)         ALL
    使用者账号  登入者的来源主机名称=(可切换的组:用户者)  可执行的命令
    
    • 1
    • 2

    带有%admin表示的是用户组,NOPASSWD表示使用sudo的时候无需密码。

    最后的ALL是允许所有命令,也可以用绝对路径指定可以执行的命令。

    也可以使用!/usr/bin/passwd root阻止其他sudo权限用户更改root的密码。这里可以使用通配符。

    !/usr/bin/passwd [A-Za-z]*

    sudo命令可以通过别名来快速设置用户以及可执行的命令,如下

    User_Alias MY_USER = user1,user2,user3,user4
    Cmnd_Alias My_USER_CMD = !/user/bin/passwd, ......
    MY_USER ALL=(root) MY_USER_CMD
    
    • 1
    • 2
    • 3

    类似的别名包括User_Alias、Cmnd_Alias、Host_Alias,都需要使用大写字符。

    sudo一般在5分钟内使用是无需再输入密码的。

    8.特殊shell
    8.1 无法登入的shell,/sbin/nologin

    使用了该shell的账号,无法登入各类shell,如bash,csh等,会显示该账号目前不可用。

    可以更改/etc/nologin.txt文件,这样可以定制显示的内容。

    8.2 PAM模块的安全限制

    /etc/security/limits.conf文件中,可以对账户做一些限制,已登入账号必须重新登入才生效。

    # /etc/security/limits.conf
    #
    #Each line describes a limit for a user in the form:
    #
    #            
    #
    #Where:
    # can be:
    #        - a user name
    #        - a group name, with @group syntax
    #        - the wildcard *, for default entry
    #        - the wildcard %, can be also used with %group syntax,
    #                 for maxlogin limit
    #        - NOTE: group and wildcard limits are not applied to root.
    #          To apply a limit to the root user,  must be
    #          the literal username root.
    #
    # can have the two values:
    #        - "soft" for enforcing the soft limits
    #        - "hard" for enforcing hard limits
    #
    # can be one of the following:
    #        - core - limits the core file size (KB)
    #        - data - max data size (KB)
    #        - fsize - maximum filesize (KB)
    #        - memlock - max locked-in-memory address space (KB)
    #        - nofile - max number of open file descriptors
    #        - rss - max resident set size (KB)
    #        - stack - max stack size (KB)
    #        - cpu - max CPU time (MIN)
    #        - nproc - max number of processes
    #        - as - address space limit (KB)
    #        - maxlogins - max number of logins for this user
    #        - maxsyslogins - max number of logins on the system
    #        - priority - the priority to run user process with
    #        - locks - max number of file locks the user can hold
    #        - sigpending - max number of pending signals
    #        - msgqueue - max memory used by POSIX message queues (bytes)
    #        - nice - max nice priority allowed to raise to values: [-20, 19]
    #        - rtprio - max realtime priority
    #        - chroot - change root to directory (Debian-specific)
    #
    #                 
    #
    
    #*               soft    core            0
    #root            hard    core            100000
    #*               hard    rss             10000
    #@student        hard    nproc           20
    #@faculty        soft    nproc           20
    #@faculty        hard    nproc           50
    #ftp             hard    nproc           0
    #ftp             -       chroot          /ftp
    #@student        -       maxlogins       4
    
    • 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
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    8.3 PAM的错误日志

    /var/log/secure的日志中,会记录一些登入错误问题,可以有助于定位账号类的问题。

    9.不同用户之间信息传递
    9.1 查询用户的名字
    命令描述
    w查询已登入的用户
    who查询已登入的用户
    last查询登入者以往的登入信息
    lastlog直接输出/etc/log/lastlog日志文件,包含大量账号最近登入的时间
    9.2 用户间交流

    使用write user [tty]可以向指定用户发送消息。

    使用mesg n/y可以开启或者关闭消息,不过对root用户来说,其消息无法屏蔽。

    可以使用wall "message"群体发送警告消息。

  • 相关阅读:
    宝塔的安装与查看
    (12)使用TSQL语句 ALTER VIEW 修改v_stu_i视图,使其具有列名学号、姓名、性 政治面貌,补全以下横线处的语句。
    Oracle查询语句中做日期加减运算
    java集合容器的特点
    ACID ,你还在为了八股文而背吗
    Android Animation的使用
    C++读取.bin二进制文件
    请你谈谈网站是如何进行访问的?【web领域面试题】
    SpringMVC原理及核心组件
    如何提升量化投研效率?来自辰钰投资的案例分享
  • 原文地址:https://blog.csdn.net/Once_day/article/details/126811406