分享一个今天遇到的运行可执行程序权限问题Permission denied
首先我的系统是一台Ubuntu ARM 64位的系统,然后运行我安装的JAVA JDK
的java
命令结果如下:
$ 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
命令:
如上发现在/
根目录下的可执行程序是ok的,这就证明了我的猜想。
那具体/data
分区跟/
分区有什么区别呢,那我们来看看/data
分区的挂载情况:
# mount |grep /data
/dev/sda4 on /data type ext4 (rw,nosuid,nodev,noexec,relatime,data=ordered,user)
从如上可以看出有个noexec
的挂载参数,noexec
标志不是默认标志,因此通常在将其显式配置为以这种方式安装时发生。
既然知道原因了,那就重新挂载/data
分区解决了。这种安全的设置在没有特殊情况下,无需如此设置,只需要使用defautls
挂载参数即可。
没有找到相关结果
已邀请:
1 个回复
Something - 90后IT男
好坑一个问题。