目录

Δ前言

一、用户组管理

        1.拾枝杂谈:

        2.修改用户所在组:

        3.修改用户的初始登录目录:

        4.如何修改文件或目录的所有者和所在组?

                4.1 改变文件所有者:

                4.2 改变文件所在组:

                4.3 同时改变文件的所有者和所在组:

二、权限控制

        1.权限说明:

        2.修改权限:

        3.权限管理案例:

                3.1 案例一: 为研发小组搭建共享代码库

                3.2 规范 Web 服务器的静态资源发布

                3.3 处理“私钥过于开放”导致的 SSH 报错

Δ总结


Δ前言


一、用户组管理

        1.拾枝杂谈:

                Linux中的组:(每个用户)
                对于Linux中每一个文件,都存在“所有者”,“所在组”,和“其他组”的概念。具体如下——
                所有者 (Owner):通常是文件的创建者,拥有最高话语权。
                所在组 (Group):文件所属的团队。组内的其他成员可以根据设置的权限来操作文件。
                其他组 (Others):既不是所有者,也不在所在组里的“路人甲”。
                PS:每当用户创建了一个文件后,这个文件的所在组默认就是该用户所在的组。

        2.修改用户所在组:

                我们在上一篇博文中提到过,“useradd -g 用户组 用户名” 命令,可以在增加一个用户的同时,直接将该用户指定到一个组中(这里的 -g 表示用户的主组)。

                同时我们也提到,如果我们想把一个用户从 A 组挪到 B 组,或者修改他的主组,可以使用 “usermod -g 用户组 用户名” 命令,来修改用户所在的组(这里的 -g 表示用户的主组)。。 
                Δ注意:这个操作必须拥有 root 权限(或者在命令前加 sudo)。例如,把用户cyan的初始组修改为developers,命令为:sudo usermod -g developers cyan.

        3.修改用户的初始登录目录:

                有时候我们需要更改用户登录后的默认家目录位置,这同样通过 usermod 来完成。指令如下:
                usermod -d 新目录路径 用户名

                但是我们要注意,首先这个指定的目录必须是真实存在的,其次该用户必须对这个新目录有访问和操作权限,否则登录时会因为进不去家目录而报错

        4.如何修改文件或目录的所有者和所在组?

                4.1 改变文件所有者:

                把一个文件的所有权转交给别人,指令如下:
                chown 新所有者 文件名/目录名
                例:chown root test.txt(把 test.txt 移交给 root)

                4.2 改变文件所在组:

                如果只想改组,不想改文件/目录的所有者,使用指令:
                chgrp 新所在组 文件名/目录名
                例:chgrp police test.txt(把文件归入 police 组)

                4.3 同时改变文件的所有者和所在组:

                其实 chown 一个指令就能干两个活,中间用冒号或点隔开:
                chown 所有者:所在组 文件名/目录名
                例:chown cyan:developers test.txt(主人改为 cyan,组改为 developers)

                PS:如果我们修改的是一个目录,并且希望目录下所有的子文件、子文件夹也跟着一起改,一定要记得加上参数 -R(表示递归):
                chown -R cyan:developers /home/cyan/my_project/


二、权限控制

        1.权限说明:

                当我们输入 ls -l 时,终端会跳出一行行字符。最左边的那 10 个字符就是理解权限的钥匙。

                ls -l 的输出结果示意图, 如下所示: 

                其中,第一个字符用于表示文件的类型,具体类型如下表所示:

第一个字符 所代表的类型
- 普通文件
d 目录
l 符号链接(软链接)
b 块设备文件
c 字符设备文件
p 命名管道
s 套接字文件

                    第一个字符后面的连续九个字符表示权限:分为三组,每组三个字符。具体表示内容如下:
                        第一组 (第 2-4 位) :文件所有者的权限 (rwx = 读写执行)
                        第二组 (第 5-7 位) :文件所属组的权限 (rwx = 读写执行)
                        第三组 (第 8-10 位) 其他用户的权限 (rwx = 读写执行)

                    前十个字符之后分别是:
                        1.一位类型 + 九位权限
                        2.硬链接数:文件或目录的硬链接数量。
                        3.所有者:文件或目录的所有者用户名。
                        4.所属组:文件或目录所属的组名。
                        5.文件大小:文件的字节数(默认)。PS: 在Linux中,ls -l 显示的文件夹大小,只是文件夹这个“目录文件”本身的大小。如果想计算文件夹内所有文件的总大小,应该使用 du -sh <文件夹名> (disk usage)命令。
                        6.最后修改时间:文件或目录的最后修改日期和时间。
                        7.文件/目录名:文件或目录的名称。

                rwx权限作用到文件 和 作用到目录 是有差异的, 具体如下:

        1) rwx 作用到文件:

                [ r ] (read):可以读取、查看文件内容。

                [ w ] (write):可以修改内容。注意:拥有写权限并不代表能删除该文件,想删除文件,前提是你必须对该文件所在的目录拥有写权限。

                [ x ] (execute):该文件可以被系统执行(如脚本、程序)。

        2) rwx 作用到目录:

                [ r ] (read):可以读取,即可以使用 ls 指令 查看该目录下的内容。

                [ w ] (write):可以修改,即可以在目录下创建、删除、重命名文件或子目录。

                [ x ] (execute):可以进入,即可以使用 cd 命令 进入该目录。

        2.修改权限:

                如果要改变一个文件或目录的权限,就要用到 chmod 指令。它有两种常用的表达方式:

                方式一:符号法(加减法)

                通过 u (owner)、g (group)、o (others)、a (all) 来指定人群,用 +、-、= 来分配权限。

                eg1: chmod u+x script.sh:给所有者增加执行权限。
                eg2: chmod g-w,o-w test.txt:取消组和其他人的写权限。
                eg3: chmod a=rwx test.txt:让所有人都有全部权限。

                方式二:数字法(最常用)

                这种方式更高效。我们给 rwx 分别赋值为:r = 4,w = 2,x = 1 ;然后通过相加得出三位数字。例如:
                rwx = 4+2+1 = 7
                rw- = 4+2+0 = 6
                r-x = 4+0+1 = 5

                常用组合

                chmod 777:所有人全开权限(不安全,慎用)。
                chmod 755:所有者全开,组和其他人只能看和进(常用于目录)。
                chmod 644:所有者可读写,其他人只能读(常用于普通配置文件)。

        3.权限管理案例:

                3.1 案例一: 为研发小组搭建共享代码库

                背景:假设公司有一个“吊大组”(genshin_team),成员有 cyan 和 alice。他们需要在 /opt 下维护一个共享代码库 /opt/secret_code。
                要求:组内成员 能自由读写,组外人员 连看一眼的资格都没有。
                实操步骤:(如下)

  1. 创建小组并添加成员(如果还没建的话)(这里的 -G 表示附加组,-a 表示追加):
    sudo groupadd genshin_team
    sudo usermod -aG genshin_team cyan
    sudo usermod -aG genshin_team alice
    # Linux 中每个用户有一个“主组”(通常是和用户名同名的组),
    # 除此之外还可以加入多个其他的“补充组 / 附加组”,以获得这些组的访问权限(比如访问某些文件夹或使用特定硬件)。
    # 附加组主要用于权限赋予。它可以让用户获得额外组的访问权限,而不改变其主组身份。
    
    # 如果不加 -a,直接使用 -G,系统会覆盖用户原有的补充组列表(即用户会被踢出原来所在的其他组,只保留现在指定的这个组)。
  2. 创建目录并初始化归属
    sudo mkdir -p /opt/secret_code
    sudo chown -R root:genshin_team /opt/secret_code  # 所有者归root,所在组归吊大组
  3. 设置权限隔离【核心】
    sudo chmod -R 770 /opt/secret_code

                第一个 7 让 root 拥有最高权;第二个 7 让 genshin_team 成员(alice 和 cyan)能 cd 进去(x)、查看列表(r)并修改代码(w);第三个 0 则是关键,它像一堵墙,彻底封死了其他所有人的路! 啊哈哈,原神启动!

                3.2 规范 Web 服务器的静态资源发布

                背景:假设你在 /var/www/html 部署了一个网站。为了安全,Web 服务进程(通常是 www-data 用户)只需要 “读” 权限来展示网页,不应该有 “写” 权限(防止黑客通过网页漏洞篡改文件);而你作为管理员(假设用户名为 deployer),需要有完整的读写权
                实操步骤:(如下)

        1. 统一归属权
                deployer 是部署代码的人,www-data 是 Web 服务器(如 Nginx/Apache)运行的用户组。这样设置后,开发部署人员和 Web 服务器都能访问这些文件。

sudo chown -R deployer:www-data /var/www/html

        2. 分层设置权限【核心】
                第一条指令和第二条指令类似,这里解读一下第一条指令:
                find指令这里的 -type d 表示 type = directory,只找目录(不找普通文件),目的是找出 /var/www/html 下面所有的文件夹
                -exec:表示对找到的每个结果,执行后面的命令
                {}:表示占位符,代表 find 找到的每一个文件夹
                \
;表示 -exec 命令结束 ( \ 表示转义,因为在 Linux 的 find 命令中,表示 -exec 结束的标记是 ;(分号))

# 对于目录,需要能进入(x)和查看(r):
find /var/www/html -type d -exec sudo chmod 750 {} \;
# 7:所有者(deployer)拥有读、写、执行权限;
# 5:所属组(www-data)拥有读、执行权限(注意:对文件夹来说,"执行"权限意味着"允许进入该目录")
# 0:其他人(其他组的用户)没有任何权限

# 对于普通文件(HTML/CSS/JS),只需要能读取(r):
find /var/www/html -type f -exec sudo chmod 640 {} \;

                3.3 处理“私钥过于开放”导致的 SSH 报错

                背景:这是一个 Linux 新手(包括up) 几乎 100% 会遇到的经典案例。假设你刚把一个用于远程登录的私钥 my_server.pem 下载到服务器上,兴冲冲地执行 ssh -i my_server.pem user@host,结果系统直接刷出一大片红色警告:"Permissions 0644 for 'my_server.pem' are too open." 并拒绝连接。
                实操步骤:(如下)

        1.观察现状

ls -l my_server.pem
# 结果通常是 -rw-r--r--,表示其他人也能读取这个私钥

        2.强制收紧权限【核心】:

chmod 600 my_server.pem

        3.再次尝试连接

ssh -i my_server.pem user@host
# 此时连接成功

                解析:Linux 的安全机制非常严格。对于 私钥 这种极其敏感的文件,它要求除了所有者本人,任何人都不能有任何权限。600(即 rw-------)是私钥文件的唯一合法通行证 (准确来说,是绝大多数程序 如 SSH 默认要求的权限)。如果权限给多了(比如 644 或 777),SSH 客户端会认为这个密钥已经不再安全,从而根据自我保护机制拒绝工作。


Δ总结

  • 🆗,以上就是本篇博文的全部内容了,感谢阅读!
  • 文章共分为了 “用户组管理” 和 “权限控制” 两大部分,其中用户组管理部分重点要掌握 chown 指令;权限控制则是重难点内容,尤其是后面的权限管理应用案例,需要多多留心。
  • 下一篇可能会更 进程与系统监控 相关的内容。敬请期待。

        System.out.println("END------------------------------");

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐