umask 命令用于设置或显示创建文件和目录时的默认权限掩码。umask 值通过屏蔽(取消)特定的权限位来控制新创建文件和目录的默认权限,是 Linux 系统中重要的权限管理机制。
umask [选项] [掩码]
常用形式:
# 显示当前umask值
umask
# 设置新的umask值
umask 掩码
# 符号模式显示
umask -S
# 显示所有用户的umask
umask -p
# 显示数字形式的umask
umask
# 输出:0022
# 以符号模式显示
umask -S
# 输出:u=rwx,g=rx,o=rx
# 显示可重用格式
umask -p
# 输出:umask 0022
# 设置umask为022
umask 022
# 设置更严格的umask
umask 077
# 设置更宽松的umask
umask 000
# 验证设置
umask
# 输出:0077
# 保存当前umask
OLD_UMASK=$(umask)
# 测试umask 022
umask 022
touch test_file1.txt
mkdir test_dir1
ls -ld test_file1.txt test_dir1
# 输出:
# drwxr-xr-x 2 user user 4096 Jan 10 10:00 test_dir1
# -rw-r--r-- 1 user user 0 Jan 10 10:00 test_file1.txt
# 测试umask 077
umask 077
touch test_file2.txt
mkdir test_dir2
ls -ld test_file2.txt test_dir2
# 输出:
# drwx------ 2 user user 4096 Jan 10 10:00 test_dir2
# -rw------- 1 user user 0 Jan 10 10:00 test_file2.txt
# 恢复原始umask
umask $OLD_UMASK
# 在 ~/.bashrc 或 ~/.profile 中设置umask
# 开发环境使用宽松权限,便于团队协作
echo 'umask 002' >> ~/.bashrc
# 重新加载配置
source ~/.bashrc
# 验证新创建的文件权限
touch new_file.txt
mkdir new_dir
ls -ld new_file.txt new_dir
# 输出:
# drwxrwxr-x 2 user user 4096 Jan 10 10:00 new_dir
# -rw-rw-r-- 1 user user 0 Jan 10 10:00 new_file.txt
# 在系统级配置文件中设置严格的umask
# 编辑 /etc/profile 或 /etc/bash.bashrc
sudo tee -a /etc/profile << 'EOF'
# 设置严格的默认权限
if [ "$(id -u)" = 0 ]; then
# root用户使用022
umask 022
else
# 普通用户使用027或077
umask 027
fi
EOF
# 或者为特定服务创建专门的配置文件
echo 'umask 077' | sudo tee /etc/systemd-umask.conf
#!/bin/bash
# 设置共享项目目录的权限
PROJECT_DIR="/shared/project"
SHARED_GROUP="developers"
# 创建共享目录
sudo mkdir -p "$PROJECT_DIR"
sudo chgrp "$SHARED_GROUP" "$PROJECT_DIR"
sudo chmod 2775 "$PROJECT_DIR" # 设置SGID位
# 为共享目录设置特定的umask
echo "cd $PROJECT_DIR" >> /etc/bash.bashrc
echo "umask 002" >> /etc/bash.bashrc
echo "共享目录配置完成"
echo "目录: $PROJECT_DIR"
echo "权限: $(ls -ld $PROJECT_DIR)"
#!/bin/bash
# 备份脚本:创建安全备份文件
BACKUP_DIR="/backup"
BACKUP_FILE="$BACKUP_DIR/sensitive_backup_$(date +%Y%m%d).tar.gz"
# 保存原始umask
ORIGINAL_UMASK=$(umask)
# 设置严格umask保护备份文件
umask 077
# 创建备份
echo "创建安全备份..."
tar -czf "$BACKUP_FILE" /etc /home/important_data
# 检查备份文件权限
echo "备份文件权限:"
ls -l "$BACKUP_FILE"
# 恢复原始umask
umask $ORIGINAL_UMASK
echo "备份完成: $BACKUP_FILE"
# 使用符号模式设置umask(某些系统支持)
umask u=rwx,g=rx,o=
# 这相当于数字模式027
umask
# 输出:0027
# 验证权限
touch symbolic_test.txt
mkdir symbolic_test_dir
ls -ld symbolic_test.txt symbolic_test_dir
# 输出:
# drwxr-x--- 2 user user 4096 Jan 10 10:00 symbolic_test_dir
# -rw-r----- 1 user user 0 Jan 10 10:00 symbolic_test.txt
# 检查系统默认umask配置
grep -r umask /etc/* 2>/dev/null
# 为所有用户设置默认umask
echo 'umask 022' | sudo tee -a /etc/profile
# 为特定用户组设置不同的umask
sudo tee /etc/profile.d/developers.sh << 'EOF'
if groups | grep -q developers; then
umask 002
else
umask 022
fi
EOF
# umask不影响特殊权限位(SUID、SGID、Sticky)
# 设置带粘滞位的目录
mkdir shared_tmp
chmod 1777 shared_tmp
# 即使umask严格,粘滞位仍然保持
umask 077
touch shared_tmp/test_file
ls -ld shared_tmp shared_tmp/test_file
# 输出:
# drwxrwxrwt 2 user user 4096 Jan 10 10:00 shared_tmp
# -rw------- 1 user user 0 Jan 10 10:00 shared_tmp/test_file
# Dockerfile中设置umask
FROM ubuntu:20.04
# 设置默认umask
RUN echo 'umask 022' >> /etc/bash.bashrc
# 或者为特定用户设置
USER appuser
RUN echo 'umask 002' >> ~/.bashrc
# 在docker run时覆盖umask
# docker run -it --env UMASK=002 myimage
#!/bin/bash
# umask诊断脚本
echo "=== Umask诊断信息 ==="
echo "当前用户: $(whoami)"
echo "当前umask: $(umask)"
echo "符号表示: $(umask -S)"
# 测试文件权限
TEST_FILE="umask_test_$$.txt"
TEST_DIR="umask_test_$$"
touch "$TEST_FILE"
mkdir "$TEST_DIR"
echo "测试文件权限: $(ls -l $TEST_FILE)"
echo "测试目录权限: $(ls -ld $TEST_DIR)"
# 清理
rm -f "$TEST_FILE"
rm -rf "$TEST_DIR"
# 检查配置文件
echo "检查umask配置:"
for file in ~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile; do
if [ -f "$file" ]; then
if grep -q umask "$file"; then
echo "在 $file 中找到umask配置:"
grep umask "$file"
fi
fi
done
# 如果新创建的文件权限不正确,检查:
# 1. 当前umask设置
umask
# 2. 是否有进程修改了umask
ps aux | grep umask
# 3. 检查所有相关的配置文件
grep -r "umask" /etc/ ~/ 2>/dev/null
# 4. 测试默认行为
(unset UMASK; touch test_permission.txt; ls -l test_permission.txt; rm test_permission.txt)
用户类型 推荐umask 说明
----------- ---------- -------------------------
普通用户 002或022 平衡安全性和便利性
root用户 022或027 更严格的安全设置
共享环境 002 便于团队协作
生产服务器 027或077 最大程度的安全保护
Web服务器 022 确保Web应用正常运作
# 在 /etc/profile 中添加安全umask配置
sudo tee -a /etc/profile << 'EOF'
# 安全umask配置
# 根据用户类型设置不同的umask
if [ "$(id -u)" -eq 0 ]; then
# Root用户 - 严格权限
umask 022
elif [ "$(id -gn)" = "$(id -un)" ]; then
# 普通用户,私有组 - 标准权限
umask 022
else
# 普通用户,共享组 - 宽松权限
umask 002
fi
EOF
umask -S 可以更直观地理解当前的权限设置umask 002 在共享环境中便于协作