脚本可以执行但不可读吗?

ash*_*him 73 permissions executable shell-script

如果没有读取权限,是否可以执行脚本?在 root 模式下,我制作了一个脚本,我希望其他用户执行此脚本但不读取它。我确实chmod禁止读写但允许执行,但是在用户模式下,我看到消息说:权限被拒绝。

Arc*_*ege 75

问题是,剧本是不是正在运行,但解释(bashperlpython等)。解释器需要阅读脚本。这与“常规”程序(如 )不同ls,因为程序直接加载到内核中,就像解释器一样。由于内核本身正在读取程序文件,因此无需担心读取访问。解释器需要读取脚本文件,因为需要读取普通文件。

  • 一种可能性是有一个简单的 C 程序来嵌入脚本并显式调用解释器。AC 程序不需要具有读取权限即可执行。 (15认同)
  • 严格来说,内核在这种情况下不区分,**它实际上会**运行 shell(就像可执行文件是二进制文件一样)。但是,shell 本身会**立即崩溃**,因为它无法读取输入文件(脚本文件内容)。 (3认同)
  • 是的,但在他的情况下有解决方案吗? (2认同)

kwa*_*ick 40

这仅适用于二进制文件。

$ chown foo:foo bar
$ chmod 701 bar
Run Code Online (Sandbox Code Playgroud)

作为非特权用户:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz
Run Code Online (Sandbox Code Playgroud)

现在,这是踢球者。虽然该文件无法通过传统方式读取,但您实际上无法阻止读取该文件。这实际上是http://smashthestack.org/上的一个挑战(级别 13)。有一个众所周知的实用程序hktrace,它允许您使用ptrace.

  • 事实上,我认为你可以阻止它。当前的 linux 内核版本将进程设置为不可转储,这意味着如果不允许用户读取二进制文件,则普通用户无法再对其进行跟踪。 (5认同)

Ren*_*nan 6

这是不可能的,至少在 Linux 上是不可能的(其他 Unices 可能允许);想想看,当您运行脚本时,shell 需要读取它才能知道要做什么。

  • 这当然是可能的;OpenBSD 允许在没有读取权限的情况下执行任何脚本。在幕后,它通过为解释器创建一个重复的文件描述符来实现这一点。 (3认同)

san*_*ana 6

前面的陈述有一半是真的。您可以设置一个脚本,使其无法被用户读取,但仍然可以执行。这个过程有点冗长,但可以通过在 /etc/sudoer 中创建一个例外来实现,这样用户就可以临时以自己的身份运行脚本而不会被提示输入密码。此方法: - 绕过其他发行版的 setuid 补丁。- 允许您临时授予特定脚本的提升权限,而无需授予用户对所有内容的 sudo 权限。

按照这篇文章的说明进行操作: 文件权限仅执行