5.1.5 脚本权限与可执行性
脚本权限与可执行性决定脚本是否能被正确调用与安全执行。Linux 通过“读/写/执行”权限控制访问,脚本要直接运行必须具备可执行权限(x),否则只能由解释器显式调用(如 bash script.sh)。
关键命令与解释(含示例):
- 查看权限:ls -l script.sh 查看权限位与属主/属组
- 授予执行权限:chmod +x script.sh 为所有者增加 x
- 精细化权限:chmod 750 script.sh 仅属主可读写执行、属组可读执行
- 属主/属组:chown user:group script.sh 确保执行者匹配权限
- umask:umask 022 影响新建文件默认权限,脚本通常不会自动拥有 x
完整可执行示例(创建、授权、执行):
# 1) 创建脚本文件
cat > /opt/scripts/backup.sh <<'EOF'
#!/bin/bash
# 备份示例:将 /etc 归档到 /tmp
tar -czf /tmp/etc-$(date +%F).tar.gz /etc
echo "backup done"
EOF
# 2) 查看权限(通常无 x)
ls -l /opt/scripts/backup.sh
# 预期:-rw-r--r-- 1 root root ...
# 3) 授权并执行
chmod 750 /opt/scripts/backup.sh
ls -l /opt/scripts/backup.sh
# 预期:-rwxr-x--- 1 root root ...
/opt/scripts/backup.sh
# 预期输出:backup done
以解释器执行(无执行权限也可运行):
chmod 640 /opt/scripts/backup.sh
ls -l /opt/scripts/backup.sh
# 预期:-rw-r----- ...
bash /opt/scripts/backup.sh
# 预期输出:backup done
常见问题与排错:
1. 报错 Permission denied
./backup.sh
# 解决:检查 x 权限
ls -l ./backup.sh
chmod +x ./backup.sh
- 报错
bad interpreter: /bin/bash^M(Windows 换行)
# 解决:转换行尾
sed -i 's/\r$//' /opt/scripts/backup.sh
- shebang 无效
# 需满足:文件可执行 + 首行正确
head -n1 /opt/scripts/backup.sh
# 预期:#!/bin/bash
安全与最佳实践:
- 最小权限原则:避免 chmod 777,生产环境建议 750 或更小权限。
- 路径调用:脚本不在 PATH 时使用 ./script.sh 或绝对路径。
- 审计与受控执行:将脚本放入受控目录,结合 sudo 规则限制执行范围。
练习:
1. 创建 hello.sh,仅允许属主执行,验证非属主无法执行。
2. 用 umask 077 新建脚本,观察默认权限并补齐执行权限。
3. 将脚本行尾改为 Windows 风格,触发 bad interpreter,再修复。