2016-11-10 56 views
0

我想知道什么时候,为什么我们需要在Linux的执行权限,虽然我们可以运行任何脚本没有执行权限,当我们执行该脚本使用的语法波纹管?为什么我们需要执行权限,尽管我们可以在没有使用“bash脚本文件”的情况下运行任何脚本?

bash SomeScriptFile 
+2

[Unix执行权限的复制可以轻松绕过。它是多余的,或者它背后的意图是什么?](http://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypasssed-is-it-superfluous-or-whats -the) –

+0

...说,'+ x'位对安全性有很强的意义的地方实际上是*目录*,而不是文件。在文件上,这是一种性能和可用性增强 - 它本身就具有足够的价值。在一个目录中,没有'+ r'的'+ x'能够遍历目录而不能读取它的内容 - 这是一个非常有价值的区别。 –

+0

增加讨论:单独从权限中删除x位并不意味着它不可能执行程序(即使它是一个编译的程序),这也不是x位的目的。例如,即使我有一个编译的程序,其权限为0444,我可以通过先复制到我自己的目录中,然后在我的副本中设置x权限,然后执行程序,轻松地运行它。 – user1934428

回答

2

并非所有程序都是脚本 - bash例如不是。所以你需要可执行程序的执行权限。

此外,当您说bash SomeScriptFile时,脚本必须位于当前目录中。如果您的脚本是可执行文件并位于PATH目录中(例如$HOME/bin),那么您可以运行该脚本,而不需要赘述bash $HOME/bin/SomeScriptFile(或bash ~/bin/SomeScriptFile);你可以简单地运行SomeScriptFile。这个经济值得拥有。

目录上的执行权限当然有些不同,但也很重要。它允许'用户类'(所有者,组和其他人)访问目录中的文件,并受到每个文件的权限限制。

+0

可能值得在目录上下文中讨论'+ x'的含义。我绝对同意这个答案是正确的,只要它是这样 - 检查inode的执行位比查找块映射并读取文件的前几个字节以查看是否有ELF或脚本头部,然后才能决定 - 但如果问题被解读,问为什么操作系统*有一个像'+ x'这样的概念,而不是为什么脚本应该设置它,然后使用它在其他情况下是密切相关的。 –

1

通过直接调用脚本来执行脚本并通过bash运行脚本是两件非常不同的事情。

当您运行bash ~/bin/SomeScriptFile时,您确实只是执行bash - 一个命令解释程序。 bash轮流加载脚本并运行它。

当你直接运行~/bin/SomeSCriptFile时,系统能够告诉这个文件是一个脚本文件,并找到解释器来运行它。在第一行中有一个很大的魔法调用#!来寻找正确的解释器。

我们直接运行脚本的原因是用户(和系统)无法知道或关心我们运行的命令是脚本还是编译的可执行文件。例如,如果我编写一个名为fixAllIlls的漂亮外壳脚本,后来我决定将其重写为C,只要我保持相同的界面,用户不必做任何不同的事情。

对他们来说,这只是一个运行的程序。

编辑

操作系统检查权限第一有以下几个原因:

  • 检查权限更快
  • 在过去的日子里,你可以有SUID脚本,所以一个需要检查权限位。
  • 因此,有可能运行您实际无法读取其内容的脚本。 (对于二进制文件,情况仍然如此)。
+0

我不确定这是为什么在查找相关魔术,找到解释器和c之前为操作系统设计检查'+ x'权限的原因。执行命令。 (我绝对同意*有*值,但我不确定这个答案是否可以解释推理)。 –

+0

@CharlesDuffy增加了一些历史 –

相关问题