此链接noexec
解释了使用 时使用选项的好处mount
。但是它列出了一个限制 - 如果我有一个以 开头的 Perl/Python/shell 脚本或文件#!
并尝试执行它 - 无论我是否提供了选项,我都可以这样做。
有没有办法阻止这种执行?即是否有其他选项noexec
可以让我提供,并且脚本将无法执行?
答案1
这里有一个重大误解。让我们把这些事情澄清一下。
首先,限制你说的,正如所说的,不是真的:
但是,当将脚本(以 she-bang 行开头的文本文件;即以 开头的行
#!
)提供给某些 shell(bash)时,它将运行该行上命名的可执行文件(例如/usr/bin/perl
),并将脚本文件的内容连接到该可执行文件的标准输入,而该可执行文件可能不在该驱动器上。
令人惊讶的是,它似乎解释了执行能力,尽管noexec
。我认为提问者一开始就完全搞错了,这不是他的错!问题中的一个错误假设导致了答案中的另一个错误假设。
那有什么问题呢?
1. Bind mount 是特定的
为了了解一些背景信息,让我们看看当您尝试将挂载绑定为只读时会发生什么。有这样一个问题:为什么 mount 不尊重绑定挂载的只读选项?结论是:
为了达到预期的结果,需要运行两个命令:
mount SRC DST -o bind mount DST -o remount,ro,bind
较新版本的 mount (util-linux >=2.27) 在运行时会自动执行此操作
mount SRC DST -o bind,ro
但是当您尝试使用noexec
而不是 时ro
,您仍然需要两个命令!在我的 Kubuntu 中,我有util-linux 2.27.1-6ubuntu3.3
这个命令:
mount SRC DST -o bind,noexec
忽略noexec
,我需要重新挂载。如果通过 挂载,情况也一样/etc/fstab
。您可以试验。随时使用普通mount
命令检查实际选项是什么。
我敢打赌,提问者以为挂载是noexec
有选项的,但实际上不是。他或她能够从所谓的noexec
挂载点内执行脚本。这很奇怪,因此才有这个问题。
然后答案作者对此进行了解释,好像是 shell 读取了 shebang,调用了另一个可执行文件,而不必担心noexec
脚本。如果挂载点确实如此noexec
,那么这将是一个合理的推测。
但…
2. 一个普遍的误解是,shell 读取 shebangs,而 kernel 却读取 shebang。
读#! shebang 如何工作?并注意到其中一个答案最初遵循了神话,然后被纠正了。
因此如果你有:
/mnt/foo/
带有选项的挂载点noexec
,- 一个可以执行的脚本
/mnt/foo/script.py
(例如chmod -x …
被调用的脚本), #!/usr/bin/python
就像剧本第一行那样的事情
然后像这样运行它
/mnt/foo/script.py
那么你的 Linux 内核将不会让你这样做,因为noexec
。如果安装确实存在,那么在另一个问题中就会发生这种情况noexec
;但我相信它不存在。
3. 尽管如此,仍然有两种方法可以“执行”脚本
来自评论:
“并尝试执行它”怎么做?直接运行还是传递给解释器?
直接运行它意味着:
/mnt/foo/script.py
这将遵守noexec
上述规定。可执行文件是 script.py
。
将其传递给解释器意味着:
python /mnt/foo/script.py
在这种情况下,可执行文件是。是否使用 挂载python
并不重要;是否可执行并不重要;shebang 是什么也不重要。重点是不执行,它是foo/
noexec
script.py
script.py
读。
只要用户可以读取文件并运行正确的解释器,就无法阻止将文件传递给解释器;但执行的不是文件。