2016-08-27 4 views
1

Я делаю проект командной строки demo в Ruby. Структура такова:Ruby Project - Предотвращение рубинового файла из непосредственного вызова из командной строки OS

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

Я хочу, чтобы пользователи только войти в приложение с помощью init.rb, но, как он стоит, любой человек может зайти в поддиректории и вызывать другие сценарии рубин непосредственно.

Вопросы:

  1. Какими способами можно выше сценарий можно предотвратить?
  2. Если бы я должен был использовать разрешения на каталоги, будет ли он сбрасываться при запуске кода с Windows-машины на Linux-машине?
  3. Есть ли что-нибудь, что может быть включено в сами файлы Ruby, чтобы предотвратить его прямое вызов из командной строки ОС?

ответ

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!' 

Вторым методом может быть проверка значения $PROGRAM_NAME в 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

ah благодарит за пояснения. – Spandan

 Смежные вопросы

  • Нет связанных вопросов^_^