• Linux 会为每个用户启动一个进程,然后由这个进程来接受用户的各种请求。

  • Linux 并不认识帐号名称,仅认识ID。

  • 用户属于一个主组,可以同时属于最多31个附属组。

  • 每个进程以一个用户的身份运行,并受到该用户访问的资源限制。

  • 每个登录用户拥有一个指定的shell。

  • 在 CLI 中,用 "$" 表示普通用户;"#" 表示 root 用户。

  • /etc/pssswd 中保存了 ID与帐号名称的对应关系,一行代表一个帐号。

      USER       口令占位符    UID    GID    用户的私人信息(全名电话等)    用户主目录    登陆Shell
      root    :x        :0    :0    :root                :/root        :/bin/bash
    
      UID    0        系统管理员 root
          1~499        供系统保留给服务使用
          500~65535    普通用户
      GID    用于在用户登录时指定其默认所在分组
  • 目前在Linux上使用最广泛的加密算法是MD5。MD5可以对任意长度的口令进行加密,并且不会产生损失。一般来说口令越长越安。

  • /etc/shadow 用于保存用户的(加密后的)口令,该文件仅对root用户可读。每一行代表一个用户:

      USER 加密后的口令                                                 上次修改口令的日期     mindays maxdays warndays inactive 帐号过期日期 保留字段
      alice:$6$/iOne7duc8soelcr$TnfUbUNzou5jn1KJxaqgZwBoJVTQdWOk.ciduQ94dce7druxoLzD/oDwjCUHr.weWTpRoe9cdXDjxnxv7Jeds7.:18638            :0    :99999    :7      :       :        :
    
      shadow 文件中,绝对日期是从1970.1.1至今的天数。可以使用usermod命令来设置过期字段(以MM/DD/YY的格式),如:sudo usermod -e 12/31/2016
  • /etc/group 文件中保存了系统中所有用户组及其成员列表。每一行表示一个组:

     GROUP    组口令占位符    GID    成员列表
     alice    :x        :1000    :
    
     如果一个用户属于 /etc/passwd 中所指定的某个组,但没有出现在 /etc/shadow 相应的组中,那么应该以 /etc/passwd 文件中的设置为准。
     实际上,用户所属组应是 passwd 和 shadow 文件中相应组的并集。为了管理上的有序性,应该保证两个文件一致。
  • Debian 在安装系统时,只有设置一个普通账户,而没有root。当需要root时,可以使用sudo命令来运行相关程序。

  • 出于安全性考虑,在输入密码时屏幕上不会有任何显示。

  • 在确定一个用户对某个文件是否具有访问权限时,系统会考察这个用户所在的所有组。

  • 默认组ID 只是在用户创建文件和目录时才有用。(决定了用户创建文件时,文件的属组)

用户

whoami    显示当前用户
who    显示有哪些用户已经登录系统
w    显示有哪些用户已经登录并且在干什么

id    显示当前用户信息

useradd    创建一个新用户or更新默认新用户信息
    ```
    useradd 命令会执行以下操作:
    1. 在 /etc/passwd 中添加用户信息;
    2. 如果使用 passwd 命令创建密码,则将密码加密保存在 /etc/shadow 
    3. 为用户建立一个新的家目录 /home/USER_NAME
    4. 将 /etc/    中的文件复制到用户的家目录中
    5. 建立一个与用户的用户名相同名称的组,新建用户默认属于这个同名组。
    ```
    $sudo useradd -m alice
    -m    --creat-home    创建用户主目录
                默认情况下,不带-m参数的useradd命令不会为新用户建立主目录。
                未创建主目录时,用户可以登录到系统的Shell,但不能够登录到图形界面!(这是因为桌面环境无论是KDE还是GNOME,需要用到用户主目录中的一些配置文件。)
    -d            家目录
    -u            userid
    -g    --gid        用户初始登录组的GID
                默认情况下,不带-g参数的useradd命令会在新建用户时,自动创建一个与新用户同名的用户组(主组)。(可以避免权限错乱)
    -G            附属组
    -s    --shell        指定用户登录后所使用的Shell
                默认为留空,让系统根据 /etc/default/useradd 中的SHELL变量选择默认登录shell
adduser    add a user or group to the system(same as 'useradd')
usermod
    -l    新用户名
    -u    新userid
    -d    用户家目录位置
    -g    用户所属主组
    -G    用户所属附属组
    -L    锁定用户,使其不能登录
    -U    解除锁定
userdel    删除用户账户和相关文件(默认情况下不会删除用户的主目录)
    $sudo userdel alice
    -r    --remove 用户主目录中的文件将随用户主目录和用户邮箱一起删除。

passwd    更改用户密码
    $sudo passwd alice
    -a    --all     只能和-S一起使用,来显示所有用户的状态。
    -d    --delete 删除用户密码。
    -e    --expire 让一个账户的密码立即过期。强制该账户下次登录时更改密码。
    -S    --status 显示账户状态信息:
        ```
        User 密码状态    最后一次更改密码的日期    mindays maxdays    warndays  禁用期
        alex P        01/11/2021         0     99999    7      -1

        密码状态:
            L    锁定密码 Lock
            NP    没有密码 No Password
            P    密码可用 Password    
        ```
    -n    --mindays  更改密码的最小间隔天数。0 表示可在任何时间更改其密码。
    -x    --maxdays  密码有效的最大天数。超过指定天数后会要求更改密码。
    -w    --warndays 在密码过期前提前提醒的天数。
    -i    --inactive 在密码过期后指定天数后禁用账户,超过指定天数后用户将不能登录过期账户。

用户组

groupadd    创建一个新的用户组
    $groupadd -g 1001 alice
    -g    --gid        The numerical value of the group's ID.
    -o    --non-unique    允许GID不唯一。
    -r    --system    创建一个系统组(GID<499)
    -f    --force        This option causes the command to simply exit with success status if the specified group already exists.
groupmod
    -n    修改祖名
    -g    修改GID
groupdel

su 和 sudo

  • su 对切换到root后,权限无限制性;(root权限不可分割,不安全)
    • 需要使用root密码登录
  • sudo 把某些root权限有针对性地下放,并且不需要普通用户知道root密码。
    • 用户不需要知道root密码,只需要使用用户自己的密码即可认证。
su    run a command with Substitute User and group ID
    $su alice
    ```
    不带任何参数的su命令会将用户提升至root权限。

    su    切换到其他用户,但是不切换环境变量;(当前用户所在目录不变)
    su -    完整地切换到一个用户环境。(切换到指定用户的家目录)
    ```
    -c    --command 变更帐号为指定的用户,执行完指定的指令后退出变成原使用者。
    -   -l    --login      start the shell as a login shell with an environment similar to a real login.

sudo    execute a command as another user
    sudo -u alice touch newFile
    -u    --user        Run the command as a user other than the default target user(usually root).
    -s    --shell        Run the shell specified by the SHELL environment variable if it is set or the shell specified by the invoking user's password database entry.(if no command is specified, an interactive shell is executed.)(将自己提升为root用户,类似于 su)
    -H    --set-home    Request that the security policy set the HOME environment variable to the home directory specified by the target user's password database entry.
    ```    
    在执行命令前,sudo会首先要求用户输入自己的口令,口令只需要输入一次。(出于安全性考虑,如果用户在一定时间内(默认是5min)没有再次使用sudo,那么需要再次输入口令)

    sudo 通过读取 /etc/sudoers 来确定用户是否可以执行相关命令:
    (sudoers 中的命令应该使用绝对路径来指定)
        # User privilege specification
        root         ALL=        (ALL:ALL)         ALL
        # root 可以在ALL机器上,以ALL用户身份,运行ALL命令。
        # Allow members of group sudo to execute any command
        %sudo    ALL=(ALL:ALL) ALL
        # %sudo代表sudo用户组中的所有用户。

    修改sudoers文件应该使用visdo命令。visudo依次执行以下操作:
        1. 检查以确保没有其他人正在编辑这个文件;
        2. 调用一个编辑器编辑该文件;
        3. 验证并确保编辑后的文件没有语法错误;
        4. 安装使sudoers文件生效。
    ```
history    列出所有使用过的命令并加以编号。(仅在BASH中适用)
    Shell 会记录用户的每一条命令。
    这些信息被存储在用户主目录的 .bash_history 文件中,这个文件默认存储1000条命令记录。
    history 10    列出最近使用的10条命令
    -c    删除所有条目从而清空历史列表
    -d N    从指定位置N处删除历史列表