L o a d i n g . . .
SHIWIVI-文章

//sunny forever
while(life<end){
love++;
beAwesome :)}

    <
  • 主题:
  • + -
  • 清除背景
  • 禁用背景
目 录
  1. 1. 用户
    1. 1.1. 查看用户信息
      1. 1.1.1. 1. id查看用户信息
      2. 1.1.2. 1. logname查看当前登录用户名
      3. 1.1.3. 2. whoami查看当前有效用户名
      4. 1.1.4. 3. who查看当前已登录用户的具体信息
      5. 1.1.5. 4. w查看用户详细登录信息
      6. 1.1.6. 5. users查看当前已登录的所有用户
      7. 1.1.7. 6. pinky打印有关用户的信息
    2. 1.2. 用户管理
      1. 1.2.1. 1. useradd添加用户
      2. 1.2.2. 2. userdel删除用户
      3. 1.2.3. 3.usermod修改用户信息
    3. 1.3. 用户密码管理
      1. 1.3.1. 1.passwd添加/修改密码
      2. 1.3.2. 2.chage修改用户密码状态
    4. 1.4. su切换用户
    5. 1.5. 用户的相关文件
      1. 1.5.1. 1. 用户的信息文件
      2. 1.5.2. 2. 用户的密码文件
      3. 1.5.3. 3. 用户的邮箱文件
      4. 1.5.4. 4. 用户模板目录
  2. 2. 用户组
    1. 2.1. 用户组管理
      1. 2.1.1. 1. 增加组
      2. 2.1.2. 2.修改用户组
      3. 2.1.3. 3. 删除用户组
      4. 2.1.4. 4. 把用户添加入组或从组中删除
      5. 2.1.5. 5.查看指定用户所在组
    2. 2.2. 用户组的配置文件
      1. 2.2.1. 1. 用户组的信息文件
      2. 2.2.2. 2. 组密码文件
  3. 3. 文件与目录权限管理
    1. 3.1. 权限管理中的参数
    2. 3.2. 递归选项-R与参数
    3. 3.3. chown更改文件所有者(change file ownership)
    4. 3.4. chgrp更改文件所属组(change file group ownership)
    5. 3.5. chmod更改权限(change the permissions mode of a file)
      1. 3.5.1. 以符号方式指定权限与用户
      2. 3.5.2. 以权限值方式为用户指定权限
    6. 3.6. umask更改新建文件时的默认权限设置(the user file-creation mask)
  4. 4. 特殊权限
    1. 4.1. 1. SetUID权限
      1. 4.1.1. 设置SUID权限
      2. 4.1.2. 取消SUID权限
    2. 4.2. 2. SetGID权限
      1. 4.2.1. 设置SGID权限
      2. 4.2.2. 取消SGID权限
    3. 4.3. 3. Sticky BIT(粘着位权限)
      1. 4.3.1. 设置SBIT权限
      2. 4.3.2. 取消SBIT权限
  5. 5. ACL权限
    1. 5.1. 查看ACL权限
    2. 5.2. 设置mask权限
    3. 5.3. 设置ACL权限
      1. 5.3.1. 1. 设置ACL权限
      2. 5.3.2. 2. 删除ACL权限
      3. 5.3.3. 3. 设置默认ACL权限
  6. 6. 文件系统属性权限chattr权限
    1. 6.0.1. 查看chattr权限方法
  • 7. sudo
    1. 7.1. sudo命令
    2. 7.2. visudo命令与sudoers文件
  • 8. 给用户发送消息
    1. 8.0.1. 1. write 给某个在线用户发送信息
    2. 8.0.2. 2. wall 给所有在线用户发送信息(write all)
  • 8.1. mail 发送邮件
  • Linux用户与权限管理

    字数:16846 写于:2021-12-29
    最新更新:2021-12-29 阅读本文预计花费您49分钟

    用户

    Linux系统是一个多用户多任务的分时操作系统,用户可以属于一个或多个组方便系统管理员控制用户权限,默认有一个root管理员组并且root账户属于该组。可以使用logout登出当前用户账户。

    查看用户信息

    1. id查看用户信息

    id [选项] [用户]

    • 默认打印当前用户信息,返回用户号(uid)、组号(gid)、所属组名
    • 用户可以通过ID或用户名指定,优先会查找用户名,可以使用+ UID形式让命令直接查找ID
    • -u 仅打印用户ID
    • -g 仅打印组ID
    • -G 打印组ID和附加组ID
    • -n 在指定了u、g、G选项时,打印对应的用户名或组名,而不是ID号
    • -r 在指定了u、g、G选项时,打印有效ID号,而不是实际ID
    • 有效ID:当用户使用su命令切换身份,或使用sudo执行命令时,用户的当前有效ID会修改为对应用户的ID,以便于临时获得其他用户的权限
    • 实际ID:用户在创建账户时分配的真实ID
    1. logname查看当前登录用户名

    logname 查看用户的原始登录用户名,如果用户使用su命令等切换用户身份,也不会修改该命令的输出,该命令的输出值通常来自/var/run/utmp或/etc/utmp文件

    2. whoami查看当前有效用户名

    whoami查看当前的有效用户名,使用su、sudo等命令切换了用户身份时,该命令的输出会随着修改

    3. who查看当前已登录用户的具体信息

    主要用来查看哪些用户正在使用系统,以及他们登录时使用的终端设备、IP 地址和登录时间等

    who [选项] [文件名] [am i]

    • 默认打印所有已登录用户的信息,包括登录用户名、登录终端(tty表示本地登录终端,pts一般为远程登录)、登陆时间(如果是远程登录显示IP地址,如果是本地登录显示为(:0))
    • 如果添加了am i参数,则只打印当前会话的用户信息
    • 该命令的输出值默认来自/var/run/utmp或/etc/utmp文件,用户可以手动指定其他文件,如 /var/log/wtmp
    • -a 显示所有信息,包括包括运行级别、系统启动时间等
    • -b 显示上次系统启动(引导)的日期和时间
    • -d 显示已终止的记录(登录结束的会话),即状态为 DEAD_PROCESS 的记录
    • -H 显示输出结果时,首行添加该列的标题,解释该列是什么信息
    • -l 只显示等待登录的进程记录,即 LOGIN_PROCESS 类型的记录
    • -m 只打印当前会话的用户信息,等价于who am i
    • -q 只显示已登录的用户名和总用户数,不显示其他详细信息
    • -r 显示当前系统的运行级别(runlevel)
    • -s 简单模式,只显示用户名、终端和登录时间(默认)
    • -T 显示每个用户终端是否允许接收消息的状态(+表示允许接收消息,-表示不允许接收消息,?表示未知)
    • -t 显示最后一次系统时间变化(通常是更改系统时间或重新启动时)
    • -u 显示已登录用户的详细信息,包括空闲时间、登录进程 ID 以及会话进程的启动时间,.表示用户在最后一分钟处于活动状态,old表示用户已空闲超过 24 小时
    • -‌-lookup 显示远程登录用户的IP地址
    # 默认情况下,who命令的输出如下 root pts/0 2022-10-08 16:54 (192.168.1.10)
    4. w查看用户详细登录信息

    该命令来源于procps-ng包,它会返回更详细的登录信息,包括当前系统上所有用户及其活动的进程

    w

    w命令返回值解析: 15:20:10 up 25 days, 15:25, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 180.129.129.129 10:09 0.00s 0.04s 0.04s -bash 第一行为登录时间,up后为linux运行时间,用户数量,服务器负载情况 第二行IDLE为用户已经空闲时间,JCPU为用户累计CPU占用时间,PCPU为用户当前命令操作占用CPU时间,WHAT为用户操作
    5. users查看当前已登录的所有用户

    users [文件名]

    • 命令会列出当前登录了系统的所有用户的用户名
    • 该命令的输出值通常来自/var/run/utmp或/etc/utmp文件,用户可以手动指定其他文件,如 /var/log/wtmp
    6. pinky打印有关用户的信息

    该命令的输出信息比上述命令详细,输出包括主目录、默认shell、

    pinky [选项] [用户名]

    • -s 以短格式输出信息,显示用户名、终端、登录时间和远程主机名(默认)
      • -w 以短格式打印时省略用户的真实姓名
      • -i 以短格式打印时,不显示用户真实姓名和远程主机
      • -q 以短格式打印时,省略用户的全名、远程主机和空闲时间
      • -f 以短格式打印时,不显示首行的标题
    • -l 生成长格式信息,必须指定至少一个用户名,输出信息包括用户名、用户真实姓名、用户主目录、shell,如果用户指定了,通常还可能包含远程主机、登录时间、空闲时间、邮件状态和计划
      • -b 以长格式输出信息时,省略用户主目录和shell
      • -h 以长格式打印时省略用户的工程文件
      • -p 以长格式打印时省略用户的计划文件
    pinky输出的用户真实姓名来自/etc/passwd文件中的用户说明字段,某些用户可能会以用户姓名,办公室地址,办公室号码,个人号码形式在用户说明中标注个人信息,pinky命令会获取这些信息并输出

    用户管理

    1. useradd添加用户

    useradd [选项] 用户名

    会在/home 目录下默认生成一个以用户名命名的文件夹作为用户的主文件夹,并且会生成一个与用户名同名的用户组

    • -c 注释       为用户添加一段注释性描述
    • -d /路径/目录名   自定义用户的主目录,即不使用与用户名同名的默认目录,如果该目录不存在,则可以同时使用-m参数来新建文件夹指定为主目录
    • -g 用户组      指定用户所属的初始用户组
    • -G 用户组,用户组  指定用户所属的附加用户组
    • -s Shell文件     指定用户的登录Shell
    • -u 用户号      指定用户的用户号,可以添加-o选项来重复使用与其他用户相同的标识号
    • -D 查看添加用户时的默认设置值(如默认shell,用户密码过期是否禁用账户等)
    • -e YYYY-MM-DD 指定账户过期日期
    • -f 值 指定该账户密码过期多少天后禁用账户,0表示一过期就禁用,1表示禁用该功能
      示例: # useradd yg 新增用户yg,同时会新建一个组yg # useradd -g gumu lmc 新增用户lmc,并且将lmc添加到gumu组 # useradd -d /somedir/user2dir -m user2 新建用户user2,在 /somedir 文件夹下新建user2dir并将其主目录指定为user2dir (somedir文件夹必须存在,无法用上述命令直接新建)
    2. userdel删除用户

    只能在root账户下删除用户

    • userdel 用户名 删除用户但保留用户的主目录(避免用户主目录有其他程序调用的重要数据)
    • userdel -r 用户名 删除用户且不保留用户主目录
    3.usermod修改用户信息

    usermod [选项] 用户名

    • -l 修改用户登录名
    • -u UID  修改用户UID
    • -c 用户说明  修改用户说明信息
    • -G 组名   修改用户附加组
    • -L   临时锁定用户
    • -U   解锁用户

    用户密码管理

    1.passwd添加/修改密码

    passwd [选项] [用户名]
    不写用户名则会修改当前账户密码,输入密码时不会显示在终端上,选项:

    • -l  锁定口令,禁止用户自行修改(参数为小写L)
    • -u  解锁口令,允许用户自行修改
    • -S  显示密码信息
    • -d  删除账户口令
    • -f  强迫用户下次登录时必须修改口令
    • -x  指定口令最长存活期
    • -k   保留即将过期的用户在期满后能仍能使用
    • -‌-stdin  允许从管道中输入口令
    2.chage修改用户密码状态

    chage [选项] 用户名

    • -l   列出用户详细密码状态
    • -d 日期  修改密码最后一次修改日期(修改shadow文件字段3)
    • -m 天数   两次密码修改间隔(字段4)
    • -M 天数   密码有效期(字段5)
    • -W 天数   密码过期前警告天数(字段6)
    • -I 天数   密码过期后宽限天数(字段7)
    • -E 日期   账号失效时间(字段8)
      使用: # chage -d 0 user1 强制用户user1下次登录修改密码

    su切换用户

    su [选项] 用户名
    从权限高的账户切换到权限低的用户不需要输入密码,反之需要。切换完用户后,可通过 exit 命令返回原来的用户

    • 如果不指定用户,默认切换到root
    • -或-l或-‌-login切换用户时会以该用户登录shell方式启动新shell,这会加载.bash_profile、.bashrc等配置文件,并且加载新用户的环境变量,连带切换用户环境,如:家目录,用户邮箱等
    • -c 命令:仅使用指定用户身份执行一次-c后的命令,执行完毕后切换回原用户身份
    • -s shell路径:切换用户后使用指定的shell,而不使用passwd文件指定的用户默认shell
    • -m或-p: 保留当前用户的环境变量,而不是使用目标用户的环境变量
    • -w 变量1 变量2…:切换用户时,保留这些变量
    • -g 用户组ID:切换用户并加入到指定的用户组
    • -G 用户组ID1,用户组ID2…:切换用户并加入到多个指定的用户组
    su命令由util-linux 软件包提供,使用时仅执行su 用户名 不会切换用户环境,在很多使用场景中会报错,推荐使用su - 用户名命令

    用户的相关文件

    1. 用户的信息文件

    文件位于/etc/passwd,每一行代表一个用户,并且以

    用户名:密码标识:用户UID:用户初始组GID:用户说明:用户HOME目录:登录默认Shell
    格式书写用户信息
    • 密码标识中,有 X 表示用户有密码,用户登录时linux会前往/etc/shadow查找密码
    • 用户UID:0 为超级管理员用户,1-999为系统用户,系统用户为ftp等由linux调用的用户,无法登录,修改可能会导致系统无法启动,1000及1000以上为普通用户(旧版本的linux可能1-500为系统用户)
    • 用户说明可以为空
    • 用户登录shell一般默认为/bin/bash,系统用户为/sbin/nologin,可以将普通用户的shell更改为/sbin/nologin来禁止用户登录
    2. 用户的密码文件

    文件位于/etc/shadow,保存了加密后的用户密码等信息,每一行代表一个用户,如:

    swv:$6$hPQczrTV$urGtx/wXaOtfIKdyuD/aUO.tHogxBM7uie4ioSbyVgcpNS3Po.:19032:0:99999:7:::
    • 字段一:用户名
    • 字段二:加密后的密码,如果为”!”表示该用户的密码被禁用,无法使用密码登录(但仍可能可以通过密钥等方式登录),如果为”*”表示没有密码,常用于系统用户
    • 字段三:密码最后一次修改日期,以1970年1月1日作为标准时间,每天+1
    • 字段四:允许的两次密码修改间隔,如:10为只允许每10天修改一次密码
    • 字段五:密码有效期,多少天后必须修改密码
    • 字段六:密码到期提前警告时间
    • 字段七:密码到期后仍然可使用时间,如:3为还可以使用3天,其中0代表到期立马失效,禁用账户,-1代表到期后仍然能永久使用
    • 字段八:账号失效时间,使用时间戳(到期时间与1970-1-1的间隔天数)表示
    • 字段九:保留字段(未使用)
    3. 用户的邮箱文件

    文件位于/var/spool/mail/用户名/,Linux用户可以相互发送内部邮件

    4. 用户模板目录

    文件位于/etc/skel/,用于制作一个模板文件,在新注册用户时会在用户家目录下自动生成该文件。如:给每个账户生成一个用户操作手册。

    用户组

    用户组管理

    用户组方便系统对同一类型的用户进行管理,对用户组的修改实际上就是对/etc/group文件的更新。

    1. 增加组

    groupadd [选项] 组名
    选项:

    • -g GID  指定新用户组的组标识号(GID)
    • -o    一般与-g参数同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。
    2.修改用户组

    groupmod [选项] 组名

    • -g GID  修改组ID
    • -n 新组名 修改组名
    3. 删除用户组

    groupdel 组名
    如果组中有初始用户,该组无法删除(以避免用户不属于任何一个组,想删除该组可以先删除该初始用户的账户),若组中都为附加用户则可以删除。

    4. 把用户添加入组或从组中删除

    gpasswd 必选参数 组名

    • -a 用户名 把用户加入组中
    • -d 用户名 把用户从组中删除
    5.查看指定用户所在组

    groups [用户名]

    • 默认查看当前用户,等价于id -Gn命令

    用户组的配置文件

    1. 用户组的信息文件

    组信息文件位于/etc/group,信息格式为:

    组名:组密码标识:组GID:组中的附加用户
    字段说明同用户配置文件类似
    2. 组密码文件

    文件位于/etc/gshadow,密码文件书写格式为:

    组名:组密码:组管理员用户名:组中的附加用户
    配置如上,该文件不常用

    文件与目录权限管理

    以下命令在指定用户、用户组时,可以使用用户名(组名),也可以使用用户ID(组GID)

    权限管理中的参数

    符号 含义 对文件 对目录
    r 读权限 可以查看文件内容 可以列出目录中的文件,查看目录中文件的详细信息
    w 写权限 可以修改文件内容 可以在目录中创建、删除、重命名文件
    x 执行权限 可以执行文件 可以进入目录(包括使用cd命令进入目录,或通过路径/path/dir1/file造访目录),允许通过路径操作目录中的文件
    - 无权限 无权限 无权限
    • 删除某个文件需要对包含该文件的父目录拥有w权限,对文件拥有w权限只能修改文件内容而不能进行删除
    • 许多命令需要通过路径来操作目录中的文件,因此往往需要同时拥有对目录的w和x权限才能完成操作

    递归选项-R与参数

    以下命令都可以添加-R选项进行递归操作,该选项会对目录下的所有文件都进行递归处理,如果递归时遇到了软链接,而该软链接又指向了另外一个目录,是否对软链接指向的目录也进行遍历取决于以下选项:

    • -p 不遍历任何软链接指向的目录(默认)
    • -H 只遍历在命令行中显式指定的链接文件所指向的目录
    • -L 遍历所有链接文件指向的目录,无论是否在命令行中指定
    e.g.以chown命令为例 目录dir1下有软链接link1和link2,它们都指向不同目录 dir1/ ├── link1 -> /path/to/dirA/ ├── link2 -> /path/to/dirB/ └── file 默认情况下,-R选项不会前往软链接所指向的源目录进行递归操作,以下命令只会修改dir1目录中文件的所有者 chown -R user1 dir1 如果要遍历link1指向的dirA目录,并修改该目录中的文件属性,需要添加-H选项,并将link1显式指定在命令行中 chown -R -H user1 dir1/link1 dir1 该命令将遍历link1所指向的目录,并修改dirA目录下所有文件的所有者

    chown更改文件所有者(change file ownership)

    chown[选项] [用户] 文件或目录1 文件或目录2…

    • 用户值可以写为用户:组形式,其中用户、冒号、组都可以只指定其中某一部分:
      • 如果只指定了用户(如user1),则将修改这些文件的所有者为指定用户
      • 如果同时指定了用户与组(如user1:group1),则将同时修改文件的所有者和所属组
      • 如果指定了用户并添加了冒号(如user1:),则文件所有者修改为该用户,所属组修改为该用户的默认登录组
      • 如果指定了组并且有冒号(如:group1),则只修改文件所属组,功能和chgrp命令相同
      • 如果只指定了冒号(:),则不进行任何修改
    • -R 以递归方式修改目录和目录下所有文件的所有者
    • -c 仅打印修改的部分,在指定了多个文件时,部分文件修改前后所有者一样,则不会打印这部分消息
    • -f 静默模式,通常用于指定多个文件时,不打印某个文件无法修改所有权时的错误信息
    • -v 详细输出每个信息
    • -‌-dereference 如果文件为软链接文件,则修改其指向的源文件或目录的所有者,而不是软链接文件本身(默认)
    • -h 如果文件为软链接文件,则修改软链接文件本身的所有者,而不是链接指向的源文件或目录
    • -‌-reference=文件名R:将文件的所有者和组修改为与文件R相同的用户和组,如果文件R是软链接,则引用其源文件的用户和组,而不是链接文件本身
    • -‌-from=owner1:如果文件当前属于owner1,执行修改操作,如果文件当前属于其他用户,则不修改
    • -H、-L、-p选项参考通用选项

    只有文件所有者用户和root用户才能更改文件的所有者属性

    chgrp更改文件所属组(change file group ownership)

    默认情况下,文件的所属组是文件所在目录,该目录的所属组,文件创建时,所属组将设置为和父目录相同的组

    chgrp [选项] [用户组] 文件或目录1 文件或目录2…

    • -R 以递归方式修改目录和目录下所有文件的所属组
    • -c 仅打印修改的部分,在指定了多个文件时,部分文件修改前后所属组一样,则不会打印这部分消息
    • -f 静默模式,通常用于指定多个文件时,不打印某个文件无法修改所属组时的错误信息
    • -v 详细输出每个信息
    • -‌-dereference 如果文件为软链接文件,则修改其指向的源文件或目录的属性,而不是软链接文件本身(默认)
    • -h 如果文件为软链接文件,则修改软链接文件本身的所属组,而不是链接指向的源文件或目录
    • -‌-from=owner1:如果文件当前属于owner1,执行修改操作,如果文件当前属于其他用户,则不修改
    • -H、-L、-p选项参考通用选项

    只有文件所有者、root用户以及拥有sudo权限、ACL权限的用户才能更改文件所属组

    chmod更改权限(change the permissions mode of a file)

    chmod [选项] 用户操作权限 文件名或目录名

    chmod [选项] 权限值 文件名或目录名

    • 只有root用户与文件所有者才能修改文件的权限
    • -R 递归修改,修改目录及其所有子文件的权限
    • -c 仅打印修改的部分,在指定了多个文件时,部分文件修改前权限一样,则不会打印这部分消息
    • -‌-dereference 如果文件为软链接文件,则修改其指向的源文件或目录的权限,而不是软链接文件本身的权限(默认)
    • -h 如果文件为软链接文件,则修改软链接文件本身的权限,而不是链接指向的源文件或目录
    • -f 静默模式,通常用于指定多个文件时,不打印某个文件无法修改其权限时的错误信息
    • -v 详细输出每个信息
    • -‌-reference=文件名R:将文件权限修改为与文件R相同,如果文件R是软链接,则引用其源文件的权限,而不是链接文件本身
    • -H、-L、-p选项参考通用选项
    以符号方式指定权限与用户

    chmod命令接受通过符号来指定用户和权限,该符号参数的组成为:用户操作权限

    • u为文件所有者,g为文件所属组,o为其他用户,a为所有用户(等价于ugo组合)
    • +为添加权限,-为取消权限,=为修改权限为等号所指(如果等号右边为空则表示删除其所有rwx权限,如:og=等价于og-rwx)
    • r为读权限,w为写权限,x为执行权限,s为SetUID或setGID权限(为u用户添加s权限即添加SetUID权限,为g用户组添加s权限即添加SetGID权限),t为粘着位(Sticky BIT)权限
    • X为条件性执行权限,X权限符只会为目录或已有执行权限的文件设置执行权限。该符号用于在批量或递归赋予x权限时,如果为所有文件都添加x权限会导致系统会将这些文件都视为可执行文件,即便他们无法执行,这些文件后续也可能会被恶意或误改为实际可执行文件(比如注入恶意代码),从而带来安全风险。X权限符只会为目录或原本就拥有x权限的文件添加可执行权限,对于原本就拥有x权限的文件而言,使用X再次添加可执行权限无任何意义,只是用来避免为普通文件也添加可执行权限,对于目录,该权限符可以用来批量为目录添加x权限,方便用户获得进入目录以及使用路径的权限。
    • 同时修改ugoa中的多个可以使用,号分隔
    e.g.1.添加文件所属组写权限,取消文件其他用户的读权限 chmod g+w,o-r file 2.将所有人权限都修改为 rwx chmod a=rwx file
    以权限值方式为用户指定权限

    chmod命令也接受权限值作为指定用户权限的参数,权限值通常为3位或4位八进制的权限值:[特殊权限][所有者权限][所属组权限][其他用户权限],特殊权限不需要时可以省略,只写3位权限值

    文件所有者、所属组、其他用户的权限值组成为:

    • r 值为4
    • w 值为2
    • x 值为1
    • rwx值为7,rw-值为6(4+2),r-x值为5(4+1),依此类推

    特殊权限的权限值组成为:

    • setUID 值为4
    • setGID 值为2
    • Sticky Bit值为1
    • SetUID+SetGID+StickyBit 值为7,SetUID+SetGID值为6,依此类推
    e.g.1.修改权限为rw-r----- chmod 640 index.html 2.添加setUID权限,用户拥有读写执行权限,用户组和其他用户只拥有读和执行权限 chmod 4755 modifyPort.sh

    umask更改新建文件时的默认权限设置(the user file-creation mask)

    • umask -S 显示新建目录时权限的默认设置
    • umask 显示默认权限值
    • umask 权限值 修改默认权限

    文件的umask值代表了给与该文件的默认权限,但它只是个掩码,它会屏蔽掉不想授予该安全级别的权限,实际赋给权限时需要进行一定的异或运算(对于值来说可视为减法运算)

    root执行umask显示默认权限值一般为0022(普通用户为0002),第一位0代表特殊权限,022为默认的权限与777权限异或后的权限值 777 rwx rwx rwx 022 --- -w- -w- =============== 755 rwx r-x r-x(默认权限) 因此需要修改默认权限时,需要先异或操作计算出权限值,如想把默认权限改为rwx --- ---,则先计算权限值 777 rwx rwx rwx 700 rwx --- --- ================= 077 --- rwx rwx 然后执行 umask 077 即可,同样,如果创建的是一个文件,Linux会在默认权限基础上取消所有用户的x权限
    新建的文件相较于新建的目录所有用户会少一个x权限,这是因为Linux会取消新建文件的可执行权限以防止危害系统的可执行程序运行

    特殊权限

    这里的特殊权限指除了读、写、执行外,为了方便文件共享设计的一些额外特殊控制权限,包括三种:SUIDSGID粘着位权限,与读写执行类似,它们的八进制权限值分别为4、2、1,即1代表仅增加/减少粘着位权限,3代表同时增加/减少粘着位权限和SGID权限,依此类推。

    1. SetUID权限

    SUID权限只用于可执行的脚本文件、命令文件等,它指定用户在执行该文件时,是以文件所有者的身份执行而非当前用户来执行。这意味着用户可以执行特定程序并且具有该程序所有者的权限,而不是当前用户的权限,程序运行完毕后会收回所有者身份。进程的用户ID也将设置为该文件所有者的ID,而非启动该进程的用户ID。

    对于目录,在该目录中创建文件时,文件的所有者将被设置为与目录所有者相同的用户,无论该文件是谁创建的。

    该权限通常用于需要以特定用户的权限来执行的程序,例如系统管理工具或安全敏感的程序,如:普通用户对 /etc/shadow 文件的权限为 0 ,即无法查看无法修改,但通过执行passwd命令,普通用户会获得临时的所有者即root权限,可以修改密码。

    • 只有可执行的二进制程序才能设置SUID权限
    • 要求命令执行者要对该程序拥有x(执行)权限
    • 命令执行者在运行该程序时会临时获得文件所有者身份
    • SUID权限只在该程序执行时有效,程序执行完毕权限失效
    设置SUID权限

    4代表SUID

    • chmod 4755 文件名 755为权限值可任意,但要保证用户有x权限
    • chmod u+s 文件名
    取消SUID权限

    chmod 755 文件名

    chmod u-s 文件名

    说明: 当设置SUID权限后,该文件权限标识中所有者的可执行权限x会被修改为s -rwsr--r-- 1 root root 174 Jan 23 18:56 file 如果该标识为大写S,则说明文件设置了SUID权限,但用户没有x权限,SUID权限无法生效,权限报错
    SUID权限可能会导致安全风险,容易造成权限滥用,Linux中默认只有/usr/bin/passwd 等少数文件有SUID权限,禁止为 vi 等命令设置该权限,否则所有用户在使用 vi 命令时都将获得 root 权限。应定时检查系统中是否有除默认以外的文件设置了SUID权限

    2. SetGID权限

    SGID权限常用于目录,一般用于在大范围环境中与人共享文档。当一个目录被设置了SGID权限后,该目录内所有新建的文件和子目录将继承该目录的所属组,而不再是创建者的所属组。因此SGID权限通常用于需要多个用户共享访问的目录,以确保目录内的文件和子目录都属于同一个特定组,让所有用户共享相同的所属组,确保文件和目录的一致性和权限的控制

    对文件

    • 只有可执行的二进制程序才能设置SGID权限
    • 要求命令执行者要对该程序拥有x(执行)权限
    • 命令执行者在运行该程序时,组身份会临时升为文件所属组身份
    • 进程的组ID将设置为文件所属组的组ID,而不是启动该进程用户的组ID
    • SGID权限只在该程序执行时有效,程序执行完毕权限失效
    说明: 当设置SGID权限后,该文件权限标识中所属组的可执行权限x会被修改为s,如 locate 命令的权限为 -rwx--s--x 1 root root 174 Jan 23 18:56 usr/bin/locate

    对目录

    • 要求用户必须拥有此目录的 r 和 x 权限
    • 普通用户进入该目录时,用户的组会升为此目录的所属组
    • 如果用户对目录有w权限,新建文件的默认组 将变为目录的所属组,而非创建者的所属组
    设置SGID权限

    2代表SGID

    • chmod 2755 文件名 755为权限值可任意,若为文件要保证拥有x权限,为目录则拥有r和x权限
    • chmod g+s 文件名
    取消SGID权限

    chmod 755 文件名

    chmod g-s 文件名

    3. Sticky BIT(粘着位权限)

    • 只对目录有效
    • 要求用户对目录拥有w和x权限
    • 没有设置粘着位权限时,用户拥有w权限后可以删除目录下的所有文件,包括其他用户创建的文件。设置粘着位后,用户只能删除自己创建的文件,root用户不受此规则影响
    说明: 当设置SBIT权限后,文件权限标识中其他用户的可执行权限x会被修改为t,如 drwxrwxrwt 1 root root 174 Jan 23 18:56 /dir/
    设置SBIT权限

    1代表SBID

    • chmod 1755 目录名 755为权限值可任意,要保证用户拥有w和x权限
    • chmod o+t 目录名
    取消SBIT权限

    chmod 755 目录名

    chmod o-t 目录名

    ACL权限

    ACL权限用于给文件所有者(u)、所属组(g)、其他用户(o)以外的用户提供权限

    查看ACL权限

    getfacl 文件名

    设置了ACL权限的文件,使用 ls -l 命令查看文件时权限标识后带有+号,如: -rw-r-xr--+ 1 root root 174 Jan 23 18:55 index.html 使用 getfacl 命令查看具体ACL权限,会多一组拥有ACL权限的 user或group 并标明用户名或组名,如: # file: index.html # owner: root # group: root user::rw- user:sw:r-x //sw用户拥有ACL权限r-x group::r-- mask::r-x other::r--

    设置mask权限

    mask权限用于指定最大的权限,防止给与用户ACL权限时权限过大。用户最终得到的权限是ACL权限于mask权限相与以后得到的权限。
    setfacl -m m:组名:权限 文件名

    设置ACL权限

    setfacl 参数 文件名

    • -m  设定ACL权限
    • -x  删除指定ACL权限
    • -b  删除文件所有ACL权限
    • -d  设定默认ACL权限
    • -k  删除默认ACL权限
    • -R  递归设置ACL权限
    1. 设置ACL权限
    • setfacl -m u:用户名:权限 文件名给用户设置ACL权限
    • setfacl -m u:用户名:权限 -R 文件名递归设置,给用户设置目录下所有子文件的ACL权限
    • setfacl -m g:组名:权限 文件名给组设置ACL权限
    • setfacl -m g:组名:权限 -R 文件名递归设置,给组设置目录下所有子文件的ACL权限
      示例: setfacl -m u:lm:r-x index.html 给与用户lm对index.html的读和执行权限
    2. 删除ACL权限

    setfacl -x [u或g]:[用户名或组名] 文件名

    删除对应用户或组的ACL权限

    setfacl -b 文件名

    删除对应文件所有ACL权限

    3. 设置默认ACL权限

    设置默认ACL权限的作用是给父目录设置ACL权限后,父目录中创建的所有子文件都会继承父目录的ACL权限,但执行命令前的文件不会拥有权限。与递归设置的区别是,递归设置的ACL权限只会给当前已经存在的子目录给与ACL权限,新建的后来文件不会拥有权限。

    • setfacl -m d:u:用户名:权限 文件名设置默认ACL权限
    • setfacl -m k:u:用户名:权限 文件名 删除默认ACL权限设置

    可以添加-R参数递归给子目录的子文件也设置默认ACL权限,但执行命令前创建的文件依旧不会有ACL权限。

    setfacl -m d:u:用户名:权限 -R 文件名

    文件系统属性权限chattr权限

    chattr [+-=][i或a] 文件或目录名

    • +为增加权限,-为删除权限,=为设置为指定权限

    • i  对文件:不允许删除、改名、添加内容或修改文件内容操作
       对目录:只能修改目录下文件的内容,不允许新建和删除文件
      对root用户生效!

    • a  对文件:只能添加新内容,不能删除、修改已有内容(并且只允许使用echo添加,不能使用vi等编辑器添加)
       对目录:只能新建和修改文件,不能删除文件
      对root用户生效!

    示例: chattr +i test 给文件test添加i属性,锁定文件,防止误操作
    查看chattr权限方法

    该权限无法使用 ls 命令查看,而需要使用:

    lsattr [参数] 文件名

    • -a 显示所有文件和目录
    • -d 若为目录,则显示目录属性,而非子文件属性

    sudo

    sudo命令允许系统管理员root临时提高普通用户的权限,让用户可以以其他身份(包括root)执行某些命令,最常见的用法是授权普通用户使用原本只有root用户才能使用的系统命令。sudo 是通过软件包提供支持的,因此它并非在所有的 Linux 发行版中默认安装(如:Arch Linux默认不安装),但在大多数现代的 Linux 发行版中,特别是面向桌面和服务器用途的发行版,sudo 通常会默认安装并配置好

    sudo官方说明文档:https://www.sudo.ws/docs/man/sudo.man

    sudo命令

    sudo [选项] [命令]

    • 默认情况下,sudo命令会以root用户身份执行命令,且默认会在当前环境下执行命令,不会加载新的环境
    • -u 用户名 指定以哪个用户的身份执行命令,如果不指定,默认以root用户执行,也可以使用-u #用户ID来指定用户,在某些Linux发行版中#号需要使用\#转义
    • -s 以指定用户的交互式非登录shell身份执行命令,载入shell环境(如:shell中定义的变量、环境变量)但不加载登录shell配置文件
    • -i 以指定用户的交互式登录shell身份执行命令,这会加载新的shell环境以及登录shell需要加载的.profile、.bash_profile等配置文件
    • 默认情况下,首次执行sudo命令需要输入当前用户密码(不是-u选项指定用户的密码),该密码认证有效期默认为5分钟,5分钟后需要重新认证,如果是高权限用户身份(如root)向低权限用户身份切换,则不要输入密码
    • -v 延长5分钟(默认)密码认证的有效时间
    • -k 重置sudo的授权时间戳,强制下次执行sudo时必须重新输入当前账户密码
    • -l 列出(list)当前用户可以使用sudo权限执行的命令,执行命令后Linux系统会要求输入当前账户密码
    • -b 在后台执行命令,用户可以继续使用终端
    • -e 文件:以指定身份使用默认编辑器编辑文件
    • -D 目录:前往指定目录下运行命令但不切换当前工作目录,如果用户没有该目录的权限,则返回错误(仅高版本sudo支持)
    • -R 目录:切换当前工作目录到指定目录,再执行命令,如果用户没有该目录权限则返回错误(仅高版本sudo支持)
    • -H 将HOME环境变量设置为指定用户的主目录
    • -E 保留当前环境变量,避免被清除
    1. 以root身份安装nginx sudo apt install nginx 2. 以user1身份编辑该用户home目录下的index.html文件 sudo -u user1 vim /home/user1/index.html 3. 以user1登录shell方式执行命令ls,由于直接指定了一个命令,ls命令执行完毕后sudo会自动退出,并返回到原始的用户会话中 sudo -u user1 -i ls 如果不指定命令,sudo会启动一个新的shell会话后等待用户输入,后续终端所有输入的命令都将以user1的身份执行,直到通过exit命令退出该shell,相当于创建了一个user1的登录shell sudo -u user1 -i 4. 列出当前用户可以用sudo执行的命令 sudo -l 5. 延长当前授权的有效期 sudo -v 6. 重置sudo的授权时间戳,下次执行sudo时需要重新输入密码 sudo -k

    visudo命令与sudoers文件

    visudo命令用来指定用户可以使用sudo提权执行哪些命令,visudo命令会打开 /etc/sudoers 文件让管理员进行编辑,文件配置格式为:

    用户名 主机地址=(赋予的身份) 授权命令1的绝对路径, 命令2的绝对路径…..

    给组添加相关权限格式类似,组名前加上%号即可。通过vi /etc/sudoers命令虽然也可以编辑该文件,但通过该修改方法容易出现语法错误从而导致配置出错,使用visudo命令虽然也会打开编辑软件,但该命令会阻止多个用户并发编辑等操作,可以在安全环境下编辑文件,并且该命令在退出时会对文件进行语法检查,避免配置出错

    e.g.文件自带了root用户的配置,即root用户在所有主机上,允许执行所有命令。类似地,wheel组也可以在所有主机上执行所有命令 root ALL=(ALL) ALL %wheel ALL=(ALL) ALL 添加允许user1用户使用sudo进行关机操作的配置项 user1 ALL=/sbin/shutdown -r now
    sudoers文件的常用配置语法: 1. sudoers提供了4种类型的别名 + User_Alias用来创建用户别名 + Host_Alias用来创建主机别名 + Cmnd_Alias用来创建命令别名 + Runas_Alias用来创建身份别名 用上述类型可以分别创建用户、主机、命令、运行环境的别名,方便批量管理,这些别名相当于一个变量名,别名由大写字母、数字和下划线字符组成,必须以大写字母开头,如: User_Alias ADMINS = alice, bob, carol Host_Alias FILE_SERVERS = fs1, fs2, fs3 Cmnd_Alias REBOOT_CMDS = /sbin/reboot, /sbin/shutdown Runas_Alias OP = root, admin 如果添加 ADMINS ALL=(root) REBOOT_CMDS 表示alice, bob, carol用户可以以root身份执行/sbin/reboot和/sbin/shutdown命令 2. NOPASSWD 选项可以让用户运行特定命令时不需要输入密码 user1 ALL = (root) NOPASSWD: /bin/kill, /usr/bin/killall 表示用户user1可以以root身份执行/bin/kill和/usr/bin/killall命令,且不需要输入密码 3. 可以使用!来禁止特定的命令 user1 ALL=(ALL) ALL, !/usr/bin/passwd 允许用户user1执行所有命令,除了/usr/bin/passwd命令
    授予命令越简单,权限越大,因此命令应该尽量详细

    给用户发送消息

    1. write 给某个在线用户发送信息

    write 用户名 信息

    给已经登录Linux的用户发送消息,Ctrl+D结束输入并发送,需要用户在线,可以使用w查询在线的账户。

    2. wall 给所有在线用户发送信息(write all)

    wall 信息

    给所有在线用户发送广播信息

    mail 发送邮件

    mail 用户名

    当用户未登录无法使用上述命令发送消息时,可以发送邮件给Linux用户。

    邮件发送: # mail 用户名 Subject : 邮件标题 //输入邮件 邮件内容 //输入邮件内容,输入完毕Ctrl+D发送

    邮件接收:
    ~ mail //查看邮件箱
    收到的邮件将以New标识(是否已读)、序号、发送用户、发送时间、邮件标题的格式列出
    -> N 1 root Sun Feb 20 12:38 18/532 “test”
    ~ 1 //直接输入序号查看对应邮件
    ~ h //列出所有邮件
    ~ d1 //d+序号删除对应邮件
    ~ q //退出邮件查看系统

    Linux会通过mail给root用户发送一些邮件反映服务器错误信息等
    上一篇:Linux服务与系统资源管理
    下一篇:Linux文件系统
    z z z z z