分享一个今天遇到的运行可执行程序权限问题Permission denied

首先我的系统是一台Ubuntu ARM 64位的系统,然后运行我安装的JAVA JDKjava命令结果如下:

$ strace /data/app/jdk1.8/bin/java -version
execve("/data/app/jdk1.8/bin/java", ["/data/app/jdk1.8/bin/java", "-version"], [/* 27 vars */]) = -1 EACCES (Permission denied)
write(2, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
exit_group(1)                           = ?
+++ exited with 1 +++

运维直接执行就是报权限问题,然后我还逐层看了目录的权限,都没有问题,而且我直接是切换到root用户下执行的,所以我就用strace命令查看具体因为啥,如上可以看出exec: Permission denied, 为啥exec执行报权限错误呢?

怎么也想不通,然后我就手动创建了一个测试脚本:

$ vim /data/app/test.sh
$ chmod +x /data/app/test.sh 
$ bash /data/app/test.sh 
test
$ /data/app/test.sh
-bash: /data/app/test.sh: 权限不够
$ strace /data/app/test.sh
execve("/data/app/test.sh", ["/data/app/test.sh"], [/* 27 vars */]) = -1 EACCES (Permission denied)
write(2, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
exit_group(1)                           = ?
+++ exited with 1 +++
$ ls -l /data/app/test.sh
-rwxr-xr-x 1 root root 12 10月 29 22:08 /data/app/test.sh

如上可知默认会用bash去解析可执行程序,所以直接bash执行可以,但是直接绝对目录执行有权限也不行,还是报权限问题,strace结果跟执行java命令结果一样,这是为啥,这时候就怀疑是不是数据盘有问题?

然后我就尝试执行/目录下的可执行程序,同样是执行java命令:
/uploads/question/20201029/d916f32c26afbd3c8ec88c0991b7274a.png
如上发现在/根目录下的可执行程序是ok的,这就证明了我的猜想。

那具体/data分区跟/分区有什么区别呢,那我们来看看/data分区的挂载情况:

# mount |grep /data
/dev/sda4 on /data type ext4 (rw,nosuid,nodev,noexec,relatime,data=ordered,user)

从如上可以看出有个noexec的挂载参数,noexec标志不是默认标志,因此通常在将其显式配置为以这种方式安装时发生。
/uploads/question/20201029/b410c54ca8d2c63a293e5c911d20ba5f.png
既然知道原因了,那就重新挂载/data分区解决了。这种安全的设置在没有特殊情况下,无需如此设置,只需要使用defautls挂载参数即可。

已邀请:

Something - 90后IT男

好坑一个问题。

要回复问题请先登录注册