Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby项目-防止从OS命令行直接调用Ruby文件_Ruby_Permissions_File Permissions - Fatal编程技术网

Ruby项目-防止从OS命令行直接调用Ruby文件

Ruby项目-防止从OS命令行直接调用Ruby文件,ruby,permissions,file-permissions,Ruby,Permissions,File Permissions,我正在用Ruby做一个演示命令行项目。结构如下: /ROOT_DIR init.rb /SCRIPT_DIR (other scripts and files) 我希望用户只使用init.rb进入应用程序,但现在任何人都可以进入子文件夹并直接调用其他ruby脚本 问题: 有什么方法可以防止上述情况 如果我要使用目录权限,那么在Linux机器上从Windows机器运行代码时,它会被重置吗 Ruby文件本身中是否有任何东西可以防止直接从OS命令行调用它 您不能使用文件权限执

我正在用Ruby做一个演示命令行项目。结构如下:

/ROOT_DIR
   init.rb
   /SCRIPT_DIR
      (other scripts and files)
我希望用户只使用
init.rb
进入应用程序,但现在任何人都可以进入子文件夹并直接调用其他ruby脚本

问题:

  • 有什么方法可以防止上述情况
  • 如果我要使用目录权限,那么在Linux机器上从Windows机器运行代码时,它会被重置吗
  • Ruby文件本身中是否有任何东西可以防止直接从OS命令行调用它

  • 您不能使用文件权限执行此操作,因为用户需要读取文件;删除
    读取
    权限意味着您也不能包含它。删除
    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]
    ):


    不过我不建议这样做,因为这不是未来的证明;如果您想重命名
    init.rb
    或编写第二个脚本,该怎么办?

    谢谢,第一个解决方案正在按预期工作。还有一个问题:FROM_INIT是一个常量,而常量在程序的生命周期中是全局的。那么像“$from_init”这样的全局变量与常量有何不同呢?@Spandan常量不能更改,而全局变量可以更改。见:;不过,全球合作也会奏效。
    unless $PROGRAM_NAME.end_with? 'init.rb'
        puts 'Must be called from init.rb'
        exit 0
    end