Ruby 项目 - 防止从 OS 命令行直接调用 ruby 文件
Ruby Project - Prevent a ruby file from directly being called from OS command line
我正在 Ruby 中做一个演示命令行项目。结构是这样的:
/ROOT_DIR
init.rb
/SCRIPT_DIR
(other scripts and files)
我希望用户只能使用 init.rb
进入应用程序,但就目前而言,任何人都可以进入子文件夹并直接调用其他 ruby 脚本。
问题:
- 有什么方法可以避免上述情况?
- 如果我要使用目录权限,当 运行 代码从 Windows 机器到 Linux 机器时,它会被重置吗?
- 是否可以在 Ruby 文件本身中包含任何内容以防止从 OS 命令行直接调用它?
您不能使用文件权限执行此操作,因为用户需要读取文件;删除 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
或制作第二个脚本怎么办?
我正在 Ruby 中做一个演示命令行项目。结构是这样的:
/ROOT_DIR
init.rb
/SCRIPT_DIR
(other scripts and files)
我希望用户只能使用 init.rb
进入应用程序,但就目前而言,任何人都可以进入子文件夹并直接调用其他 ruby 脚本。
问题:
- 有什么方法可以避免上述情况?
- 如果我要使用目录权限,当 运行 代码从 Windows 机器到 Linux 机器时,它会被重置吗?
- 是否可以在 Ruby 文件本身中包含任何内容以防止从 OS 命令行直接调用它?
您不能使用文件权限执行此操作,因为用户需要读取文件;删除 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
或制作第二个脚本怎么办?