Linux /tmp目录下执行脚本失败提示Permission denied
Linux上执行具有可执行权限Shell脚本失败提示Permission denied问题的分析过程。
问题现象
Linux /tmp目录下,执行./test.sh运行失败,提示Permission denied。
问题分析
1、检查test.sh脚本是否有可执行权限。执行ls -al test.sh,权限为777。具有可执行权限。
2、尝试使用sh test.sh运行,可以执行。为啥。。
3、是/tmp目录没有执行权限?执行stat / 和stat /tmp发现权限都满足。也不是该原因引起的。下图stat命令执行结果供参考。
4、借助搜索。发现是由于/tmp文件系统的属性被设置了noexec导致该目录下的程序无法执行。noexec表示对应文件系统不允许执行可执行程序,即使文件具有可执行过权限。通常是考虑安全原因会这么设置。
问题解决
1、将脚本放到其他不具有noexec文件系统目录执行或者使用sh test.sh运行。
2、如果程序必须在/tmp目录下以./test.sh方式运行。通常是第三方调用情况。可以将/tmp文件系统中noexec属性去掉,操作步骤如下(说明:仅限测试环境操作)
(1)在/etc/fstab文件中将/tmp文件系统的noexec属性删掉。
(2)重新挂载/tmp文件系统。执行umount /tmp; mount /tmp将/tmp文件重新挂载。
知识拓展
这里无法一时间解决该问题主要是因为不了解文件系统挂载参数的约束。学习下/etc/fstab文件及挂载参数内容。
/etc/fstab文件内容总共包含6列。
第一列:Device:磁盘设备文件或者该设备的Label、UUID
第二列:Mount point:设备的挂载点,就是你要挂载到哪个目录下。
第三列:filesystem:磁盘文件系统的格式,包括ext2、ext3、reiserfs、nfs、vfat等。可以使用df -T查看
第四列:parameters:文件系统的参数
Async/sync 设置是否为同步方式运行,默认为async(性能较佳)
auto/noauto 当执行mount -a 的命令时,此文件系统是否被主动挂载。默认为auto
rw/ro 是否以只读或者读写模式挂载
exec/noexec 限制此文件系统内是否能够运行可执行文件。
user/nouser是否允许用户使用mount命令挂载
suid/nosuid 是否允许SUID的存在
Usrquota 启动文件系统支持磁盘配额模式。这个涉及到磁盘配额的知识。有兴趣可以扩展看看
Grpquota 启动文件系统对群组磁盘配额模式的支持
Defaults 同时具有rw,suid,dev,exec,auto,nouser,async等参数。基本上,默认使用Defaults设置即可。
第五列:能否被dump备份命令作用:dump是一个用来作为备份的命令。通常值为0或者1。测试环境很少用。
第六列:是否检验扇区:开机的过程中,系统默认会以fsck检验我们系统是否为完整(clean)。一般来说,根目录设置为1,其他的文件系统设置为2。以前经常会在IBM的AIX系统遇到该问题。
总结
看了这个案例,相信如果你以后再遇到Shell脚本运行失败提示Permission denied的问题,解决它的概率就比别人大很多了。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义