添加Python3 Shebang后仍遭-bash: ./main.py: Permission denied问题求助
无法直接执行Python脚本,始终提示“Permission denied”
问题描述
我希望无需每次输入python3就能直接执行脚本,同时简化cron任务调度,但无论尝试何种方法,始终遇到错误:-bash: ./main.py: Permission denied。
我已尝试以下操作:
- 为脚本添加
#!开头的shebang,测试了/usr/bin/下所有Python版本,#!后加或不加空格均无效 - 使用
/usr/bin/env [python version]的方式调用不同Python版本 - 给
/usr/bin下所有Python文件设置chmod 777权限 - 给脚本目录下所有文件和文件夹设置
chmod 777权限 - 运行脚本的用户同时属于
root和wheel组 - 以root身份运行脚本,仍得到相同错误
- 确保所有脚本文件都添加了shebang
补充说明:我已重装bash和python,并对所有脚本执行dos2unix排除换行符问题,但仍未解决。
解决方案与排查方向
1. 检查文件系统挂载的noexec属性
执行mount命令查看脚本所在目录的挂载信息,如果挂载选项中包含noexec,意味着该分区禁止执行任何文件,这会导致即使设置了chmod +x也无法直接运行脚本。
- 临时解决:执行
mount -o remount,rw,exec /path/to/your/dir重新挂载目录 - 永久解决:编辑
/etc/fstab,移除对应分区的noexec选项,然后执行mount -a生效
2. 验证shebang的准确性
- 先用
which python3获取Python的绝对路径,比如输出/usr/local/bin/python3 - 确保脚本第一行的shebang与该路径完全一致,例如
#!/usr/local/bin/python3,或者使用#!/usr/bin/env python3(注意不要有多余空格或隐藏字符) - 用
head -n1 main.py查看shebang是否正确,避免出现拼写错误或不可见字符
3. 检查SELinux/AppArmor安全策略
如果系统开启了SELinux,执行getenforce查看状态:
- 若显示
Enforcing,临时执行setenforce 0关闭SELinux后再测试脚本 - 如果临时关闭后可以运行,需要调整SELinux上下文,执行
chcon -t bin_t main.py为脚本设置可执行的上下文,或者添加自定义策略
4. 确认脚本所在分区的文件系统类型
FAT32、NTFS等非Linux原生文件系统不支持权限位设置,即使执行chmod +x也不会生效。如果脚本存储在这类分区上,需要将其移动到ext4、xfs等支持Linux权限的文件系统中。
5. 排查文件开头的特殊字符
除了换行符,脚本开头可能存在UTF-8 BOM等不可见字符,导致shebang失效:
- 执行
cat -A main.py查看文件开头是否有^@或\xef\xbb\xbf这类特殊字符 - 如果存在,用
sed -i '1s/^\xef\xbb\xbf//' main.py移除BOM字符
内容的提问来源于stack exchange,提问作者Binsky734
相关产品推荐
相关产品推荐

