【问题标题】:Ruby Project - Prevent a ruby file from directly being called from OS command lineRuby Project - 防止从操作系统命令行直接调用 ruby​​ 文件
【发布时间】:2017-01-03 21:38:16
【问题描述】:

我正在用 Ruby 做一个演示命令行项目。结构是这样的:

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

我希望用户只能使用init.rb 进入应用程序,但就目前而言,任何人都可以进入子文件夹并直接调用其他 ruby​​ 脚本。

问题:

  1. 有哪些方法可以预防上述情况?
  2. 如果我要使用目录权限,在将代码从 Windows 机器运行到 Linux 机器时会重置吗?
  3. 是否可以在 Ruby 文件本身中包含任何内容以防止从操作系统命令行直接调用它?

【问题讨论】:

    标签: ruby permissions file-permissions


    【解决方案1】:

    您不能使用文件权限执行此操作,因为用户需要读取文件;删除 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!'
    

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

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

    我不建议这样做,因为它不是很面向未来;如果您想重命名init.rb 或制作第二个脚本怎么办?

    【讨论】:

    • 谢谢,第一个解决方案可以正常工作。还有一个问题:FROM_INIT 是一个常量,并且一个常量在程序的生命周期内是全局的。那么像“$from_init”这样的全局变量与常量有什么不同呢?
    • @Spandan 常量不能更改,而全局变量可以。见:pastebin.com/QEUdxhiK;不过,全局也可以。
    猜你喜欢
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多