我很好奇,在下面的场景中,shell脚本或Java程序有什么样的权限(所有者/组/其他)?
有一个名为 的脚本run.sh
,它依次调用一个 Java 程序a.java
。该脚本和java属于用户A所有并具有-rwxrw-r--
权限。当它们被用户A运行时,它们属于哪个权限组?他们是否获得了用户 A 作为所有者的许可?
还有一个用户B,与用户A同组,他执行run.sh
并依次调用Java程序。现在他们属于哪个权限组?他们是否获得了用户 B 的集体许可?
也许程序会尝试在/common/abc
具有 权限的目录上写入drwxrw-r--
,如果程序具有“其他”权限,则会失败。
需要注意的一点是,它们都使用表达式sh run.sh
来运行脚本,因此不需要执行权限。只需要读取权限吗?
答案1
所有进程开始以与调用它们的进程相同的用户和组的身份执行,除非它们是通过设定值或 setgid 可执行文件,即具有rws
或r-s
或-ws
或--s
在其权限中的可执行文件。位以外的权限位s
无关。仅当脚本为 setuid(即s
在用户列中设置了位)时,可执行文件的所有者才重要;并且仅当脚本为 setgid(即s
在组列中设置了位)时,所属组才重要。
因此,在您描述的场景中,当用户 A 运行脚本时,脚本和 Java 程序都以用户 A 以及 A 所属的组的身份执行。当它们由用户 B 执行时,它们将以用户 B 以及用户 B 所属的任何组的身份执行。
运行本机可执行文件需要执行权限,仅此而已。运行脚本(以 开头的程序#!
)需要执行权限(在机制接管之前开始执行#!
)和读取权限(供解释器读取脚本)。如果显式调用解释器,则脚本不需要可执行:就系统而言,它只是另一个数据文件。