Linux中unmask的使用原理,永久生效

本文详细解释了Linux系统中umask的作用及其对文件权限的影响。通过示例展示了如何使用umask来调整新创建文件的默认权限,并介绍了如何设置特殊权限如setuid、setgid和sticky位。此外,还提供了使umask设置永久生效的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,查看自己当前unmask情况:

$ umask
0022

umask每一位对应的是一个八进制,转成二进制来说明,0022的二进制是 000 000 010 010

忽略掉开头的三个零(我们一会儿再讨论)

关键在于:掩码的二进制形式中,出现数字1的位置,表示关掉相应一个文件模式属性。为0的保持不变

预备知识点:linux的默认权限(无umask时的权限)都为目录777 — rwx rwx rwx,文件666 — rw- rw- rw-

举例1:

原文件权限— rw- rw- rw-
umask000 000 000 010
结果— rw- rw- r–

举例2:

原文件权限— rw- rw- rw-
umask000 000 010 010
结果— rw- r-- r–

所以,umask作用的是位置,可将umask理解成原权限要减去的权限:

umask=000
(rw-rw-rw-)-(---------)=rw-rw-rw-=666

umask=011
(rw-rw-rw-)-(-----x--x)=rw-rw-rw-=666

umask=022
(rw-rw-rw-)-(----w--w-)=rw-r--r--=644

umask=033
(rw-rw-rw-)-(----wx-wx)=rw-r--r--=644

umask=044
(rw-rw-rw-)-(---r--r--)=rw--w--w-=622

umask=055
(rw-rw-rw-)-(---r-xr-x)=rw--w--w-=622

其实本质上,是和默认权限做了NOT运算

例如:
666=0110 0110 0110
umask=000=0000 0000 0000 NOT运算 1111 1111 1111

0110 0110 0110
1111 1111 1111
------------------------------
0110 0110 0110=666

umask=011=0000 0001 0001 NOT运算 1111 1110 1110

0110 0110 0110
1111 1110 1110
------------------------------
0110 0110 0110=666

umask=022=0000 0010 0010 NOT运算 1111 1101 1101

0110 0110 0110
1111 1101 1101
------------------------------
0110 0100 0100=644

umask=033=0000 0011 0011 NOT运算 1111 1100 1100

0110 0110 0110 
1111 1100 1100
------------------------------
0110 0100 0100=644

开头的三个零

一些特殊权限

虽然我们通常看到一个八进制的权限掩码用三位数字来表示,但是从技术层面上来讲, 用四位数字来表示它更确切些。为什么呢?因为,除了读取,写入,和执行权限之外,还有 其它的,较少用到的权限设置。

其中之一是 setuid 位(八进制4000)。当应用到一个可执行文件时,它把有效用户 ID 从真正的用户(实际运行程序的用户)设置成程序所有者的 ID。这种操作通常会应用到 一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个程序由根用户(root) 所有,并且设置了 setuid 位,这个程序运行时具有超级用户的特权,这样程序就可以 访问普通用户禁止访问的文件和目录。很明显,因为这会引起安全方面的问题,所有可以 设置 setuid 位的程序个数,必须控制在绝对小的范围内。

第二个是 setgid 位(八进制2000),这个相似于 setuid 位,把有效用户组 ID 从真正的 用户组 ID 更改为文件所有者的组 ID。如果设置了一个目录的 setgid 位,则目录中新创建的文件 具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权。对于共享目录来说, 当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不管文件所有者的主用户组时, 那么设置 setgid 位很有用处。

第三个是 sticky 位(八进制1000)。这个继承于 Unix,在 Unix 中,它可能把一个可执行文件 标志为“不可交换的”。在 Linux 中,会忽略文件的 sticky 位,但是如果一个目录设置了 sticky 位, 那么它能阻止用户删除或重命名文件,除非用户是这个目录的所有者,或者是文件所有者,或是 超级用户。这个经常用来控制访问共享目录,比方说/tmp。

这里有一些例子,使用 chmod 命令和符号表示法,来设置这些特殊的权限。首先, 授予一个程序 setuid 权限。

chmod u+s program

下一步,授予一个目录 setgid 权限:

chmod g+s dir

最后,授予一个目录 sticky 权限:

chmod +t dir

当浏览 ls 命令的输出结果时,你可以确认这些特殊权限。这里有一些例子。首先,一个程序被设置为setuid属性:

-rwsr-xr-x

具有 setgid 属性的目录:

drwxrwsr-x

设置了 sticky 位的目录:

drwxrwxrwt

永久生效

umask 命令设置的掩码值只能在当前 shell 会话中生效,若当前 shell 会话结束后,则必须重新设置。
怎样使掩码值永久生效?

/etc/profile 中加上如下:
umask 你需要的掩码值
然后重新登录

### 如何在 Linux 系统中配置防火墙以开放 9007 端口 #### 启动并确认防火墙运行状态 为了确保可以正常操作防火墙,需验证 `firewalld` 是否正在运行。如果未启动,则需要手动启用。 ```bash systemctl status firewalld ``` 如果显示 `inactive (dead)`,则表示防火墙尚未启动。可以通过以下命令启动防火墙: ```bash systemctl start firewalld ``` 若遇到启动失败的情况,可能是由于服务被锁定所致。此时可尝试解锁服务后再重新启动: ```bash systemctl unmask firewalld.service systemctl start firewalld.service ``` 以上步骤能够解决大部分因服务锁定而导致的启动失败问题[^1]。 --- #### 添加端口到防火墙规则 要允许外部访问特定端口(如 9007),需要将其添加至防火墙规则中。以下是具体的操作方法: 通过 `firewall-cmd` 命令实现端口开放: ```bash firewall-cmd --add-port=9007/tcp --permanent ``` 此命令的作用是永久性地向防火墙规则中加入 TCP 协议下的 9007 端口,并标记为持久化存储以便于系统重启后仍然生效[^2]。 完成上述修改后,还需重载防火墙配置使更改立即生效: ```bash firewall-cmd --reload ``` 最后一步非常重要,因为只有当防火墙重新加载其配置文件时,新增加的内容才会被执行。 --- #### 查看端口是否成功开放 为了检验新添加的端口是否已经正确开放,可以查询当前活动中的所有监听端口号列表或者单独查找某个具体的端口是否存在其中: ```bash firewall-cmd --list-ports ``` 这会返回目前由防火墙管理的所有开放端口集合。假如之前所设的 9007 被列入其中,则说明设置无误;反之亦然。 另外也可以针对单个端口做进一步核查: ```bash firewall-cmd --query-port=9007/tcp ``` 如果输出结果为 `yes` 则代表该端口已被成功开启;如果是 `no` 就意味着可能存在问题需要排查原因[^2]。 --- #### 自定义场景下其他注意事项 对于某些特殊环境而言,除了基本的端口开放外还可能存在额外需求比如限定源地址范围等更精细控制措施,在这种情况下就需要利用更加复杂的参数组合来满足实际应用场景的要求了。 例如仅允许来自某一段 IP 地址区间内的客户端连接服务器上的这个端口: ```bash firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9007" accept' --permanent ``` 这条指令将会创建一条富规则,它规定只接受来自于 IPv4 类型网络里属于子网掩码长度为 24 的 192.168.1.x 子网内部发起的数据包请求到达目标主机上的 tcp 协议编号为 9007 的那个通信接口处[^2]。 随后同样记得再次刷新整个框架结构使之即时反映最新调整情况下来保障策略得以贯彻实施下去即可。 --- ### 总结 综上所述,通过一系列标准化流程就可以轻松达成让 linux 平台上面部署的服务程序对外界提供稳定可靠的服务接入能力的目的啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值