Ruby项目-防止从OS命令行直接调用Ruby文件
我正在用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命令行调用它 您不能使用文件权限执
/ROOT_DIR
init.rb
/SCRIPT_DIR
(other scripts and files)
我希望用户只使用init.rb
进入应用程序,但现在任何人都可以进入子文件夹并直接调用其他ruby脚本
问题:
您不能使用文件权限执行此操作,因为用户需要读取文件;删除
读取
权限意味着您也不能包含它。删除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