2016-08-27 32 views
1

我正在Ruby中执行一个演示命令行项目。该结构是这样的:Ruby项目 - 防止从操作系统命令行直接调用ruby文件

/ROOT_DIR 
    init.rb 
    /SCRIPT_DIR 
     (other scripts and files) 

我只允许用户进入使用init.rb的应用程序,但因为它的立场,任何人都可以进入子文件夹,并直接调用其他Ruby脚本。

问题:

  1. 可以在上面的场景防止有什么办法呢?
  2. 如果我要使用目录权限,当从Windows计算机上运行代码到Linux机器上时它会重置吗?
  3. 有什么可以包含在Ruby文件本身,以防止从OS命令行直接调用它?

回答

2

由于用户需要读取文件,因此无法使用文件权限执行此操作;删除read权限意味着您不能包含它。删除execute权限可用于指示这些文件不打算执行,但不会阻止人们输入ruby incl.rb


最简单的方法可能是设置一个全局变量在init.rb脚本:

#!/usr/bin/env ruby 

FROM_INIT = true 
require './incl.rb' 

puts 'This is init!' 

,然后检查该变量在包含incl.rb文件中定义:

unless defined? FROM_INIT 
    puts 'Must be called from init.rb' 
    exit 0 
end 

puts 'This is incl!' 

第二种方法可能是检查的值0在incl.rb;这种存储当前的程序名称(如argv[0]在许多其他语言):

unless $PROGRAM_NAME.end_with? 'init.rb' 
    puts 'Must be called from init.rb' 
    exit 0 
end 

我不建议这样做虽然,因为它不是很经得起未来考验;如果你想重命名init.rb或制作第二个脚本怎么办?

+0

谢谢,第一个解决方案正在按照需要工作。还有一个问题:FROM_INIT是一个常量,在程序的整个生命周期中,常量是全局的。那么像“$ from_init”这样的全局变量如何与常量不同呢? – Spandan

+0

@Spandan一个常量不能改变,而一个全局变量可以。请参阅:http://pastebin.com/QEUdxhiK;全球也将工作。 – Carpetsmoker

+0

啊谢谢澄清。 – Spandan