为什么你的bash脚本执行不了?
在服务器维护过程中,写好的bash脚本却提示“权限不够”,这是很多人踩过的坑。最常见的原因就是没给脚本文件加上可执行权限。Linux系统对权限管得严,哪怕脚本内容写得再完美,没有执行权限也白搭。
比如你在/home/user/bin/下写了个backup.sh,想每天自动备份数据库,结果crontab跑的时候报错:Permission denied。这时候别急着查语法,先看看权限。
chmod的基本用法
chmod用来修改文件的权限模式。最常用的写法是用数字表示权限:
- 4 表示读(r)
- 2 表示写(w)
- 1 表示执行(x)
这三个数字可以相加。比如7就是4+2+1,代表读、写、执行全开。
要让你的脚本能运行,通常需要加上执行权限:
chmod +x backup.sh这行命令会给所有用户加上执行权限。你也可以更精确地控制:
chmod 755 backup.sh意思是属主有读写执行(7),组用户和其他人只有读和执行(5)。
在脚本里主动设置权限
有些场景下,你希望脚本自己确保某些文件权限正确。比如部署脚本要保证配置文件不能被随便改:
#!/bin/bash
# 部署应用后,保护配置文件
cp config.example.conf /etc/app/config.conf
chmod 600 /etc/app/config.conf # 只有root能读写
# 给日志目录开放写权限
chmod 755 /var/log/myapp
chown root:myapp /var/log/myapp这种写法在自动化部署时特别有用,避免人为遗漏。
别乱用777
新手常犯的一个错误是:脚本跑不了?那就chmod 777吧。这一招确实能解决问题,但代价是安全风险大增。777意味着任何人对这个文件都有完全控制权,一旦被恶意利用,后果严重。
尤其是web服务器上,php或bash脚本如果权限过松,容易被上传木马并执行。正确的做法是遵循最小权限原则——只需要谁能执行,就给谁加权限。
结合find批量处理脚本权限
在维护多台服务器时,可能需要统一修复一批脚本的权限。比如找出所有以.sh结尾的文件,并加上执行权限:
find /opt/scripts -name "*.sh" -type f -exec chmod 755 {} \;这条命令能在指定目录下自动识别脚本文件并修正权限,适合用于环境初始化或故障恢复。
权限问题看着小,但在生产环境中经常引发意外。花几分钟检查chmod设置,能省下几小时排错时间。