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的问题,解决它的概率就比别人大很多了。