我想知道什么时候,为什么我们需要在Linux的执行权限,虽然我们可以运行任何脚本没有执行权限,当我们执行该脚本使用的语法波纹管?为什么我们需要执行权限,尽管我们可以在没有使用“bash脚本文件”的情况下运行任何脚本?
bash SomeScriptFile
我想知道什么时候,为什么我们需要在Linux的执行权限,虽然我们可以运行任何脚本没有执行权限,当我们执行该脚本使用的语法波纹管?为什么我们需要执行权限,尽管我们可以在没有使用“bash脚本文件”的情况下运行任何脚本?
bash SomeScriptFile
并非所有程序都是脚本 - bash
例如不是。所以你需要可执行程序的执行权限。
此外,当您说bash SomeScriptFile
时,脚本必须位于当前目录中。如果您的脚本是可执行文件并位于PATH目录中(例如$HOME/bin
),那么您可以运行该脚本,而不需要赘述bash $HOME/bin/SomeScriptFile
(或bash ~/bin/SomeScriptFile
);你可以简单地运行SomeScriptFile
。这个经济值得拥有。
目录上的执行权限当然有些不同,但也很重要。它允许'用户类'(所有者,组和其他人)访问目录中的文件,并受到每个文件的权限限制。
可能值得在目录上下文中讨论'+ x'的含义。我绝对同意这个答案是正确的,只要它是这样 - 检查inode的执行位比查找块映射并读取文件的前几个字节以查看是否有ELF或脚本头部,然后才能决定 - 但如果问题被解读,问为什么操作系统*有一个像'+ x'这样的概念,而不是为什么脚本应该设置它,然后使用它在其他情况下是密切相关的。 –
通过直接调用脚本来执行脚本并通过bash
运行脚本是两件非常不同的事情。
当您运行bash ~/bin/SomeScriptFile
时,您确实只是执行bash
- 一个命令解释程序。 bash
轮流加载脚本并运行它。
当你直接运行~/bin/SomeSCriptFile
时,系统能够告诉这个文件是一个脚本文件,并找到解释器来运行它。在第一行中有一个很大的魔法调用#!
来寻找正确的解释器。
我们直接运行脚本的原因是用户(和系统)无法知道或关心我们运行的命令是脚本还是编译的可执行文件。例如,如果我编写一个名为fixAllIlls
的漂亮外壳脚本,后来我决定将其重写为C
,只要我保持相同的界面,用户不必做任何不同的事情。
对他们来说,这只是一个运行的程序。
编辑
操作系统检查权限第一有以下几个原因:
我不确定这是为什么在查找相关魔术,找到解释器和c之前为操作系统设计检查'+ x'权限的原因。执行命令。 (我绝对同意*有*值,但我不确定这个答案是否可以解释推理)。 –
@CharlesDuffy增加了一些历史 –
[Unix执行权限的复制可以轻松绕过。它是多余的,或者它背后的意图是什么?](http://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypasssed-is-it-superfluous-or-whats -the) –
...说,'+ x'位对安全性有很强的意义的地方实际上是*目录*,而不是文件。在文件上,这是一种性能和可用性增强 - 它本身就具有足够的价值。在一个目录中,没有'+ r'的'+ x'能够遍历目录而不能读取它的内容 - 这是一个非常有价值的区别。 –
增加讨论:单独从权限中删除x位并不意味着它不可能执行程序(即使它是一个编译的程序),这也不是x位的目的。例如,即使我有一个编译的程序,其权限为0444,我可以通过先复制到我自己的目录中,然后在我的副本中设置x权限,然后执行程序,轻松地运行它。 – user1934428