如果没有权限读取脚本,是否可以执行该脚本?在 root 模式下,我制作了一个脚本,我希望其他用户执行该脚本但不读取它。我确实chmod
禁止读取和写入但允许执行,但是在用户模式下,我看到了消息:权限被拒绝。
答案1
问题是脚本不是正在运行的,而是解释器(bash
、perl
、python
等)。口译员需要阅读脚本。这与“常规”程序(例如 )不同,ls
因为该程序像解释器一样直接加载到内核中。由于内核本身正在读取程序文件,因此不需要担心读取访问。解释器需要读取脚本文件,就像需要读取普通文件一样。
答案2
这仅适用于二进制文件。
$ chown foo:foo bar
$ chmod 701 bar
作为非特权用户:
$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar
$ cat bar
cat: bar: Permission denied
$ ./bar
baz
现在,问题来了。虽然通过传统方式无法读取该文件,但您实际上无法阻止读取该文件。这实际上是一个挑战http://smashthestack.org/(13级)。有一个众所周知的实用程序,hktrace
它允许您使用ptrace
.
答案3
前面的说法只说对了一半。您可以设置一个脚本,使其不被用户读取,但仍然可执行。该过程有点冗长,但可以通过在 /etc/sudoer 中设置例外来实现,以便用户可以暂时以自己的身份运行脚本,而不会提示输入密码。此方法: - 绕过其他发行版的 setuid 补丁。 - 允许您临时为特定脚本授予提升的权限,而不向用户授予对所有内容的 sudo 权限。
请按照这篇文章中的说明进行操作: 文件权限仅执行
答案4
我认为你可以用 来做到这一点setuid
。
但你不能,因为大多数发行版(显然)已经setuid
禁用,因为这是一个巨大的安全漏洞。它在我的上被禁用,所以我实际上不知道这个答案是否有效,无论如何我都会发布它,因为我认为它应该。
不管怎样,如果我想做你想做的事——而且我有一个setuid
启用了脚本的发行版——我会做类似的事情:
$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!
也就是说,我会编写另一个脚本,其唯一目的是调用 root 只读脚本,将其更改为 root 所有,并为其授予 setuid 权限。 (以及其他人随之而来的不可写状态。)
由于 myscript-nonroot 函数对每个人都是可读的,因此它可以被读取和执行,并且当您获得实际执行脚本的两行时 ( bash myscript
),它正在以 root 身份(或您想要的任何其他人,确切的用户)运行没关系,只要包装文件由同一用户拥有即可。)