脚本怎样查看修改文件权限属性

wen 实用脚本 31

从基础命令到自动化运维全解析

📖 目录导读

  1. 文件权限基础概念
  2. 使用 ls -l 查看文件权限
  3. stat 命令:深入查看权限属性
  4. chmod 修改权限的脚本化操作
  5. chownchgrp 修改所有权
  6. 脚本实战:批量修改与自动化排查
  7. 常见问题QA

文件权限基础概念

在Linux/Unix系统中,每个文件都有三类权限(读r、写w、执行x),对应三类用户(所有者owner、所属组group、其他人others),权限数字表示法:r=4, w=2, x=1,如755表示所有者rwx,组与其他人r-x。

脚本怎样查看修改文件权限属性

Q:为什么脚本中需要查看和修改文件权限?
A:自动化部署时,脚本文件需执行权限;配置文件需只读保护;日志文件需允许写入,权限错误常导致“Permission denied”或安全漏洞。


使用 ls -l 查看文件权限

最直接的查看方式:

ls -l script.sh
# 输出示例:-rwxr-xr-- 1 root root 1234 Jan 1 10:00 script.sh

分解权限字段:

  • 第1个字符:(普通文件)、d(目录)、l(链接)
  • 第2-4字符:所有者权限(rwx)
  • 第5-7字符:组权限(r-x)
  • 第8-10字符:其他人权限(r--)

脚本中利用ls提取权限:

perms=$(ls -l script.sh | cut -d' ' -f1)
echo "权限字符串:$perms"

stat 命令:深入查看权限属性

stat 提供更结构化的权限数据,适合脚本解析:

stat -c "%a %A %U %G" script.sh
# 输出示例:755 -rwxr-xr-x root root

参数说明:

  • %a:八进制权限(如755)
  • %A:人类可读格式
  • %U:所有者用户名
  • %G:所属组名
  • %F:文件类型

Q:statls在脚本中如何选择?
A:stat -c输出格式可控,避免解析ls的复杂输出;但ls更直观用于人工检查。


chmod 修改权限的脚本化操作

1 符号模式与数字模式

# 给所有者加执行权限
chmod u+x script.sh
# 设置精确权限为755
chmod 755 script.sh
# 递归修改目录下所有脚本
chmod -R 750 ./scripts/

2 脚本中条件修改

#!/bin/bash
target_file="/opt/app/deploy.sh"
if [ -f "$target_file" ]; then
    current_perms=$(stat -c "%a" "$target_file")
    if [ "$current_perms" != "755" ]; then
        chmod 755 "$target_file"
        echo "已修改$target_file权限为755"
    else
        echo "权限正确,跳过"
    fi
fi

3 使用find批量修改

# 将所有.sh文件设为可执行
find /project -name "*.sh" -exec chmod +x {} \;
# 查找权限不安全的文件(如其他人可写)
find /var/www -perm /o+w -type f

Q:如何通过脚本判断权限是否安全?
A:结合find -perm-not -perm筛选,例如检查是否没有设置SUID位:
find /bin -perm -4000 -type f 查找SUID文件。


chownchgrp 修改所有权

1 修改所有者

chown appuser:appgroup config.yaml
# 仅修改所有者:chown appuser config.yaml
# 递归:chown -R appuser:appgroup /data

2 脚本中批量修改

#!/bin/bash
log_dir="/var/log/myapp"
expected_user="loguser"
expected_group="loggroup"
find "$log_dir" -type f | while read file; do
    owner=$(stat -c "%U" "$file")
    group=$(stat -c "%G" "$file")
    [ "$owner" != "$expected_user" ] && chown "$expected_user" "$file"
    [ "$group" != "$expected_group" ] && chgrp "$expected_group" "$file"
done

脚本实战:批量修改与自动化排查

案例1:部署脚本自动修正权限

#!/bin/bash
# 用途:部署后确保web目录安全
DIR="/var/www/example"
echo "===== 开始权限检查 ====="
# 1. 目录权限应为755
find "$DIR" -type d -exec chmod 755 {} \;
# 2. 文件权限应为644
find "$DIR" -type f -exec chmod 644 {} \;
# 3. 但脚本文件需可执行
find "$DIR" -name "*.cgi" -o -name "*.pl" | xargs chmod 755
# 4. 不能存在其他人可写文件
bad_files=$(find "$DIR" -perm /o+w -type f)
if [ -n "$bad_files" ]; then
    echo "警告:以下文件不安全:"
    echo "$bad_files"
    # 自动修复:去掉其他人写权限
    echo "$bad_files" | xargs chmod o-w
fi
echo "===== 权限修正完成 ====="

案例2:监控并报告权限变化

#!/bin/bash
# 生成权限快照,用于对比
snapshot_file="/tmp/perms_snapshot_$(date +%Y%m%d).txt"
find /critical_data -type f -exec stat --format="%a %U %G %n" {} \; > "$snapshot_file"
# 与上一次快照对比
prev_snapshot=$(ls -t /tmp/perms_snapshot_*.txt | head -2 | tail -1)
if [ -f "$prev_snapshot" ]; then
    diff "$prev_snapshot" "$snapshot_file" | grep -E "^[<>]" | while read line; do
        if echo "$line" | grep -q "^>"; then
            echo "新增/修改:$(echo "$line" | cut -d' ' -f2-)"
        fi
    done
fi

Q:脚本中如何避免权限修改导致服务中断?
A:先备份原始权限:find /target -type f -printf '%m %u %g %p\n' > backup.txt;修改后验证关键文件权限。


常见问题QA

Q1:为什么我的脚本显示“Permission denied”?

A:可能原因包括:

  • 脚本文件缺少执行权限:chmod +x script.sh
  • 目标目录不可写:检查目录权限ls -ld /path
  • 当前用户不是所有者:使用sudo或修改所有者

Q2:如何批量修改不同扩展名为不同权限?

A:使用case语句或关联数组:

declare -A perms_map=(
    ["sh"]="755"
    ["conf"]="644"
    ["key"]="600"
)
for ext in "${!perms_map[@]}"; do
    find /opt -name "*.$ext" -exec chmod ${perms_map[$ext]} {} \;
done

Q3:脚本中如何检查SUID/SGID位?

A:使用find -perm /4000stat -c "%a"检测权限数字,例如4000为SUID,2000为SGID:

if [ $(stat -c "%a" /usr/bin/su) -ge 4000 ]; then
    echo "SUID位已设置"
fi

Q4:修改权限后需要重启服务吗?

A:通常不需要,权限修改立即生效,但若修改了正在运行的脚本,重新执行时才会使用新权限,部分服务会缓存文件权限,如Nginx的stat检查,会被立即识别。


通过以上方法,你可以使用脚本系统性地查看、修改和审计文件权限属性,从基础的ls命令到stat结构化输出,再结合findchmod的批量操作,最终实现自动化权限管理,确保系统安全与运维效率,建议将关键权限检查集成到CI/CD流水线中,防患于未然。

抱歉,评论功能暂时关闭!