这里有一个重大的误解。让我们把这些事情说清楚。
首先,正如所说的那样,您所指的限制是不正确的:
然而,当一个脚本(与她邦行开始的文本文件,即与开头的行
#!
)是给一些炮弹(bash)的,它会运行一个名为该线路上的可执行文件(例如,/usr/bin/perl
)和连接脚本文件的内容到该可执行文件的标准输入,可能不在该驱动器上。
令人惊讶的是,它似乎解释了执行能力,尽管noexec
. 我认为那里的提问者一开始就搞错了,这不是他或她的错!问题中的一个错误假设导致了答案中的另一个错误假设。
那有什么问题呢?
为了获得一些上下文,让我们看看当您尝试将 mount 绑定为只读时会发生什么。有一个问题:为什么挂载不尊重绑定挂载的只读选项?结论是:
要获得所需的结果,需要运行两个命令:
Run Code Online (Sandbox Code Playgroud)mount SRC DST -o bind mount DST -o remount,ro,bind
较新版本的 mount (util-linux >=2.27) 在运行时会自动执行此操作
Run Code Online (Sandbox Code Playgroud)mount SRC DST -o bind,ro
但是当您尝试使用noexec
代替时ro
,您仍然需要两个命令!在我的 Kubuntu 中,我有util-linux 2.27.1-6ubuntu3.3
这个命令:
mount SRC DST -o bind,noexec
Run Code Online (Sandbox Code Playgroud)
忽略noexec
,我需要重新安装。如果安装是通过/etc/fstab
. 你可以实验。随时使用普通mount
命令检查实际选项是什么。
我敢打赌提问者认为坐骑有noexec
选项,但实际上并非如此。他或她能够从据称的noexec
挂载点内执行脚本。这很奇怪,因此问题。
然后答案作者对此进行了解释,就好像它是读取shebang的shell一样,调用另一个可执行文件并且不担心noexec
脚本。如果挂载点是真的,noexec
那么这将是一个合理的推测。
但…
阅读#! Shebang工作?并注意那里的答案之一最初遵循神话,然后被纠正。
所以如果你有:
/mnt/foo/
带noexec
选项的挂载点,/mnt/foo/script.py
否则可执行的脚本(例如chmod -x …
被调用),#!/usr/bin/python
脚本中的第一行一样的shebang你像这样运行它
/mnt/foo/script.py
Run Code Online (Sandbox Code Playgroud)
那么你的 Linux 内核不会让你因为noexec
. 如果安装确实noexec
在那里,它就会发生在另一个问题中;但我相信事实并非如此。
来自评论:
“并将尝试执行它”如何?通过直接运行它还是将它传递给解释器?
直接运行它意味着:
/mnt/foo/script.py
Run Code Online (Sandbox Code Playgroud)
这将兑现noexec
上面详述的内容。可执行文件是 script.py
.
将它传递给解释器意味着:
python /mnt/foo/script.py
Run Code Online (Sandbox Code Playgroud)
在这种情况下,可执行文件是python
. 是否foo/
安装都没关系noexec
; 是否script.py
可执行并不重要;shebang是什么并不重要。重点script.py
不是执行,而是读取。
只要用户可以读取文件并运行正确的解释器,就没有办法阻止将文件传递给解释器;但它不是执行的文件。