脚本跑不起来?可能是权限在作怪
前几天同事小李急匆匆跑来问:“我写了个备份脚本,放到服务器上怎么一运行就报‘没有权限执行脚本’?”这问题太常见了,尤其在Linux服务器上,脚本写完传上去,一执行就卡这儿。
先看错误长什么样
典型的报错信息类似这样:
bash: ./backup.sh: Permission denied
或者你在网页环境中看到:
Failed to execute script: Operation not permitted
这说明系统明确拒绝了执行请求,不是语法错,也不是文件不存在,而是“你不被允许干这事”。
检查文件执行权限
在Linux下,文件有读(r)、写(w)、执行(x)三种基本权限。脚本要运行,必须有执行权限。用 ls -l 看一眼:
ls -l backup.sh
如果显示的是 -rw-r--r--,说明没有x权限。加上就行:
chmod +x backup.sh
再运行 ./backup.sh,大概率就好了。
别忘了用户身份问题
有时候你用root改好了权限,但实际运行脚本的是www-data用户(比如PHP调用),那还得看这个用户有没有权限执行。可以临时切换用户测试:
sudo -u www-data ./backup.sh
如果还是不行,就得考虑是不是目录权限、SELinux策略,或者脚本里调用了其他受限命令。
Web环境下的特殊限制
有些服务器为了安全,默认禁用某些函数,比如PHP的 exec、shell_exec。你写的脚本没问题,但PHP就是不让调。查一下php.ini:
disable_functions = exec,shell_exec,passthru
如果有这些,要么联系运维打开,要么换方案,比如用系统定时任务(crontab)代替页面触发。
Windows也别忽视
在Windows服务器上,尤其是通过PowerShell运行脚本,会遇到“无法加载脚本,因为在此系统上禁止执行脚本”的提示。这是执行策略(Execution Policy)在起作用。查一下当前策略:
Get-ExecutionPolicy
如果是 Restricted,那就放开一点:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
注意别用 Unrestricted,安全性太差。RemoteSigned 对本地脚本比较友好,又不至于完全放开。
还有种可能是路径问题
你以为在运行自己的脚本,其实系统找到了另一个同名命令。比如你写了python脚本叫backup,但系统PATH里有个同名二进制。用绝对路径执行试试:
/home/user/myscripts/backup.sh
或者用 ./backup.sh 明确指定当前目录。
别忽略挂载属性
如果脚本放在U盘、NFS或Docker挂载卷里,可能挂载时加了 noexec 选项,意思就是“这片区域不准执行任何程序”。查看挂载情况:
mount | grep <你的挂载点>
如果看到 noexec,就得重新挂载,去掉这个选项,或者把脚本移到正常分区。