Linux下权限正常的Perl脚本无法直接执行的原因排查
Perl脚本执行提示Permission Denied的原因排查
我有一段简单的Perl脚本:
#!/usr/bin/perl print "###################################\n";
直接执行时始终报错:
[root@testbox001 tmp]# ./def -bash: ./def: Permission denied
但脚本本身已经具备执行权限:
-rwxr-xr-x 1 root root 88 Dec 22 01:42 def
bash和shebang指向的Perl解释器也都有执行权限:
[root@testbox001 tmp]# ls -l /usr/bin/bash -rwxr-xr-x. 1 root root 1150560 Jun 20 2022 /usr/bin/bash [root@testbox001 tmp]# ls -l /usr/bin/perl -rwxr-xr-x. 2 root root 12752 Jan 17 2023 /usr/bin/perl
目前只能通过显式调用Perl解释器执行脚本:
[root@testbox001 tmp]# /usr/bin/perl def ######################################################### [root@testbox001 tmp]#
可能的原因分析
- 脚本所在分区挂载了
noexec选项:这是最常见的情况,比如/tmp分区通常默认挂载noexec参数,禁止在该分区内执行文件。可以通过mount | grep $(dirname ./def)查看分区挂载参数,若输出包含noexec则确认是该问题。解决方法是重新挂载分区去掉noexec(mount -o remount,rw,exec /tmp),或把脚本移到无noexec限制的分区。 - shebang行存在隐藏特殊字符:如果脚本是在Windows环境编辑后传到Linux的,可能带有Windows格式换行符(CRLF),导致系统将
#!/usr/bin/perl\r当作完整命令路径(末尾多了\r字符),找不到对应解释器。用cat -A def查看脚本内容,若shebang行末尾有^M符号则确认。解决方法是用dos2unix def转换格式,或用sed -i 's/\r$//' def去除CR字符。 - SELinux安全策略限制:若系统SELinux处于Enforcing模式,可能阻止脚本执行。用
getenforce查看状态,若为Enforcing可临时关闭测试:setenforce 0,如果此时脚本能正常执行,需调整SELinux上下文或修改策略。
内容的提问来源于stack exchange,提问作者Boykaczhu
相关产品推荐
相关产品推荐

