• CentOS初步学习记录(五)用户和用户组


    一、前言

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

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

    每个用户账号都拥有一个惟一的用户名和各自的口令,以及每个用户的独有文件夹(/home/用户名),Root用户的目录比较特殊(/ROOT),用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

    预设情況下,系统中所有的帐号与一般身份使用者,以及 root 的相关信息,都是记录在 /etc/passwd 文件中,每个人的密码则是记录在 /etc/shadow 文件下, 所有的组群名称记录在 /etc/group 內。 

    二、用户管理

    2.1 用户创建

    1)基本语法

    useradd 选项 用户名

    2)选项

    • -c:加上备注文字,备注文字保存在 passwd 的备注栏中
    • -d:指定用户登入时的启始目录
    • -D:变更预设值
    • -e:指定账号的有效期限,缺省表示永久有效
    • -f:指定在密码过期后多少天即关闭该账号
    • -g:指定用户所属的起始群组
    • -G:指定用户所属的附加群组
    • -m:自动建立用户的登入目录
    • -M:不要自动建立用户的登入目录
    • -n:取消建立以用户名称为名的群组
    • -r:建立系统账号
    • -s:指定用户登入后所使用的 Shell
    • -u:指定用户 ID 号

    3)实例

    useradd –d /usr/txl -m txl

    此命令创建了一个用户 txl,其中 -d 和 -m 选项用来为登录名 txl 产生一个主目录 /usr/txl(/usr为默认的用户主目录所在的父目录)。

    2.2 用户删除

     1)基本语法

    userdel 选项 用户名

    2)选项

    • -r:把用户的主目录一起删除

    3)实例

    userdel -r txl

    此命令删除用户txl在系统文件中(主要是 /etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。

    2.3 用户口令管理

    用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

    指定和修改用户口令的 Shell 命令是 passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。

    1)基本语法

    passwd 选项 用户名

    普通用户修改自己的口令时,passwd 命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令

    2)选项

    • -l 锁定口令,即禁用账号。
    • -u 口令解锁。
    • -d 使账号无口令。
    • -f 强迫用户下次登录时修改口令。

    3)实例

    例如,假设当前用户是 txl,则下面的命令修改该用户自己的口令:

    $ passwd 
    Old password:****** 
    New password:******* 
    Re-enter new password:*******

    如果是超级用户,可以用下列形式指定任何用户的口令:

    # passwd txl 
    New password:******* 
    Re-enter new password:*******

    2.4 用户修改

    修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录 Shell 等。

    1)基本语法

    usermod 选项 用户名

    2)选项

    • -c<备注>:修改用户帐号的备注文字
    • -d<登入目录>:修改用户登入时的目录
    • -e<有效期限>:修改帐号的有效期限
    • -f<缓冲天数>:修改在密码过期后多少天即关闭该帐号
    • -g<群组>:修改用户所属的群组
    • -G<群组>:修改用户所属的附加群组
    • -l<帐号名称>:修改用户帐号名称
    • -L:锁定用户密码,使密码无效
    • -s<shell>:修改用户登入后所使用的shell
    • -u<uid>:修改用户ID
    • -U:解除密码锁定

    常用的选项包括 -c, -d, -m, -g, -G, -s, -u 以及 -o 等,这些选项的意义与 useradd 命令中的选项一样,可以为用户指定新的资源值。

    另外,有些系统可以使用选项:-l 新用户名,这个选项指定一个新的账号,即将原来的用户名改为新的用户名,如:

    usermod -s /bin/ksh -d /home/z –g developer txl

    此命令将用户 txl 的登录 Shell 修改为 ksh,主目录改为 /home/z,用户组改为 developer。

    3)实例

    usermod -s /sbin/nologin txl

    此命令禁止用户 txl 进行 Shell 登录。

    2.5 用户切换

    使用 su 命令切换当前用户身份到其他用户身份,除 root 外,需要键入该使用者的密码。

    1)基本语法

    su [-] 用户 [选项]

    使用 su 命令只是切换了身份,但 Shell 环境仍然是普通用户的 Shell;而使用 su - 则会连用户和 Shell 环境一起切换。

    2)选项

    • -c <指令> 或 --command=<指令>:执行完指定的指令后,即恢复原来的身份
    • -f 或 --fast:适用于 csh 与 tsch,使 shell 不用去读取启动文件
    • -l 或 --login:改变身份时,也同时变更工作目录,以及 HOME,SHELL,USER,logname。此外,也会变更 PATH 变量
    • -m, -p 或 --preserve-environment:变更身份时,不要变更环境变量
    • -s <shell> 或 --shell=<shell>:指定要执行的shell
    • --help:显示帮助
    • --version;显示版本信息

    三、用户组管理

    每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

    3.1 用户组创建

    1)基本语法

    groupadd 选项 用户组

    2)选项

    • -g:GID 指定新用户组的组标识号(GID)
    • -o:一般与-g选项同时使用,表示新用户组的 GID 可以与系统已有用户组的 GID 相同

    3)实例

    groupadd group1

    此命令向系统中增加了一个新组 group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。

    3.2 用户组删除

    1)基本语法

    groupdel 用户组

    2)实例

    groupdel group1

    此命令从系统中删除组 group1。

    3.3 用户组修改

    1)基本语法

    groupmod 选项 用户组

    2)选项

    • -g:GID 为用户组指定新的组标识号
    • -o:与 -g 选项同时使用,用户组的新 GID 可以与系统已有用户组的 GID 相同
    • -n <新用户组>:将用户组的名字改为新名字

    3)实例

    groupmod –g 10000 -n group3 group2

    此命令将组 group2 的标识号改为 10000,组名修改为 group3。

    四、文件 /etc/passwd

    1)用户名:每个用户的标识字符串,在同一系统中是惟一的,且大小写敏感

    2)口令:这里的 x 表示是暗文显示

    3)用户标识号(uid):每个用户必须被分配一个userid,0为 root 保留 ID,1-99为系统保留,分配给系统预定义帐号。

    Linux用户可以分为3类:超级用户(root  用户标识号是0)、管理用户和普通用户。

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

    常见的伪用户:

    伪用户含义
    bin 拥有可执行的用户命令文件
    sys 拥有系统文件
    adm 拥有帐户文件
    uucp UUCP使用
    lp lp或lpd子系统使用
    nobody NFS使用

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

    4)组标识号(gid):字段记录的是用户所属的用户组。它对应着 /etc/group 文件中的一条记录。

    5)用户描述:包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等,这个字段并没有什么实际的用途。

    6)主目录:用户的起始工作目录,它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

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

    若设置为:/sbin/nologin,则代表这个用户不能登录。这样做的好处是,ftp 用户只能通过 ftp 登录 ftp 服务器,而不能登录到 shell 中。

    五、Shell Script 实例

    有时候为了安全,我们的软件在运行时不推荐使用 ROOT 账户运行。所以我们会有个初始化 shell 脚本,来创建用户和初始化文件:

    1. 判断用户是否存在(譬如叫 txl),没有则创建
    2. 创建后设置密码为123
    3. 切换为 txl 用户,在它对应环境变量里新建一个shell文件,执行后输出 i am txl,并且除了 root 外,只能 txl 用户运行(root 也不能方便的运行)

    5.1 判断用户是否存在

    1)通过 /etc/passwd 文件内容判断

    USER_COUNT=`cat /etc/passwd | grep '^txl:' -c`
    if [ $USER_COUNT -gt 0 ]
        then
            #...
    fi

    2)通过 Shell 特殊变量判断

    useradd txl
    if [ $? -eq 0 ]
        then
            #...
    fi

    Shell 特殊变量:

    变量含义
    $0 当前脚本的文件名
    $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
    $# 传递给脚本或函数的参数个数。
    $* 输入的参数的具体内容(将输入的参数作为一个单词)
    $@ 输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列表)
    $? 上个命令的退出状态,或函数的返回值。
    $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

    5.2 屏蔽错误提示信息

    当执行 useradd txl 时,如果该用户存在,会输出一个错误提示信息,可以通过空设备文件 /dev/null 屏蔽:

    useradd txl 2 > /dev/null
    if [ $? -eq 0 ]
        then
            #...
    fi

    /dev/null :代表空设备文件

    > :代表重定向到哪里,例如:echo "123" > /home/123.txt
    1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
    2 :表示stderr标准错误
    & :表示等同于的意思,2>&1,表示2的输出重定向等同于1

    5.3 设置用户密码

    使用 passwd 修改密码需要提示和确认,需要强迫设置:

    echo "123" | passwd txl --stdin

    stdin:标准输入(键盘)

    --stdin:使用非交互模式输入

    在 Debian / Ubuntu 中没有该参数,可以使用 chpasswd 命令:

    echo txl:123 | chpasswd

    完整代码:

    # USER_COUNT=`cat /etc/passwd | grep '^txl:' -c`
    useradd txl 2>/dev/null
    if [ $? -eq 0 ]
      then
        echo "123" | passwd txl --stdin
        echo "done"
      else
        if [ ! -d /home/txl/bin ]
          then
            su - txl -c "mkdir bin"
            echo "bin is created"
        fi
        su - txl -c 'echo "echo i am txl" > bin/me'
        su - txl -c 'chmod u+x bin/me'
    fi
  • 相关阅读:
    多线程访问成员变量与局部变量
    Could not resolve placeholder 解决方案
    instanceof, isinstance,isAssignableFrom的区别
    YYYY-mm-dd HH:MM:SS
    整合Spring Data JPA与Spring MVC: 分页和排序
    dubbo配置文件xml校验报错
    安装eclipse插件时出现问题
    Windows上搭建hadoop开发环境
    jquery validate 在ajax提交表单下的验证方法
    HDU 1698 Just a Hook(线段树区间替换)
  • 原文地址:https://www.cnblogs.com/tangxuliang/p/9122279.html
Copyright © 2020-2023  润新知