为什么我可以执行一个不可执行的新创建的文件?

时间:2016-07-21 20:23:50

标签: linux

在Ubuntu中,Ubuntu上的默认umask是022,这意味着新创建的文件可供所有人读取,但只有所有者可写,没有人可以执行它。 在这种情况下,我创建一个新文件:

touch test.rb  # Its content is: puts "hello world"
ls -l demo.rb  # -rw-r--r--

然后我执行test.rb

ruby test.rb  # output: "hello world"

由于文件的所有者没有“x”权限,那么为什么我可以成功运行该文件?或者我错过了一些关于它的知识?

2 个答案:

答案 0 :(得分:3)

您没有将文件作为二进制文件执行。您正在使用参数ruby执行test.rb二进制文件,并解释Ruby脚本。因此,只有ruby二进制文件需要执行特权而不是脚本本身。

您可以通过运行stat (which ruby)来检查二进制文件的权限。

另一方面,如果你放置

#!/usr/bin/ruby
在脚本顶部

并使用chmod a+x test.rb使其可执行,然后您可以让Linux运行它。内核的binfmt模块将检查文件中的#!(称为shebang),然后为您运行解释器。

你可以在很多shell脚本中找到这个shebang。现在通常会放置#!/usr/bin/env ruby#!/usr/bin/env python,以便在PATH变量/usr/local/bin/ruby变量上的其他位置使用解释器二进制文件。再次env只是另一个二进制程序。它将作为一个程序运行其参数。内核将脚本作为参数传递,这将导致命令/usr/bin/env ruby test.rb

答案 1 :(得分:1)

GrzegorzŻur是对的。

您可以像这样修改test.rb:

#!/usr/bin/env ruby
puts 'hello world'

然后您使用.

执行此操作
$ ./test.rb  

您会看到Permission denied