rails 3.2.1 rails runner дает сбой при выполнении сценария setuid на Solaris 10

Мы должны использовать планировщик на основе мейнфрейма вместо cron для выполнения служебных задач. Этот планировщик связывается с агентом на хосте, который затем выполняет общий сценарий setuid ksh, который принимает в качестве аргументов утилиту для выполнения вместе с любыми требуемыми аргументами. Затем скрипт setuid ksh вызывает другой скрипт со своими аргументами.

В моем случае следующий скрипт (execute_something.ksh) устанавливает некоторые переменные среды, cds в корень Rails и делает rails runner Module.function -e <environment>, где среда — это передаваемый аргумент.

Так вот:

mainframe -> agent -> setuid_script -> execute_something.ksh -> Module.function

Когда я вызываю execute_something.ksh напрямую от себя, все работает нормально. Когда я вызываю сценарий setuid, я получаю следующую ошибку:

/[path]/bin/rails:15:in `force_encoding': неизвестное имя кодировки - BINARY (ArgumentError) из /[path]/bin/rails:15:in main

Это не вопрос о разрешениях. Все задействованные файлы либо принадлежат пользователю setuid, либо имеют полные групповые разрешения для группы setgid и принадлежат этой группе. (Да, перебор, но это то, что мне дали.)

Сценарий setuid наследует мою среду (за исключением того, что есть EUID пользователя setuid).

Кроме того, исполняемый скрипт rails отличается от того, что был установлен на моем ноутбуке с Linux (я упоминал, что это проблема Solaris).

Скрипт рельсов:

#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'railties' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'

version = ">= 0"

if ARGV.first
  str = ARGV.first
  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
  if str =~ /\A_(.*)_\z/
    version = $1
    ARGV.shift
  end
end

gem 'railties', version
load Gem.bin_path('railties', 'rails', version)

Это работает как я. Я явно удалил все ссылки на песочницу моего домашнего каталога в PATH и LD_LIBRARY_PATH - это все еще работает для меня, а не для пользователя setuid.

У меня нет прав на изменение чего-либо в глобальной среде — я должен вводить запросы и ждать. Невозможно изменить способ выполнения модуля.

Пожалуйста, кто-нибудь - дайте мне несколько идей? Я не думаю, что это относится ко многим людям, но разве это не интересная головоломка?

ТИА.

Карильда


person Carilda    schedule 06.06.2012    source источник


Ответы (1)


Цель команды rails — вызвать script/rails, если они есть, поэтому вы можете просто вызвать этот скрипт напрямую:

./script/rails runner Module.function -e <environment> 
person Oscar Del Ben    schedule 07.06.2012
comment
Спасибо, но когда я попробовал это, я получил следующее: ./script/rails:4:in expand_path': Insecure operation - expand_path (SecurityError) from ./script/rails:4:in ‹main›' - person Carilda; 08.06.2012
comment
Какую версию (с патчем) Ruby вы используете? - person Oscar Del Ben; 08.06.2012
comment
Кроме того, какова ценность $SAFE в вашем приложении? - person Oscar Del Ben; 08.06.2012
comment
рубин 1.9.3p125; в консоли rails $SAFE показывает 0. Будет ли это то же самое в самом приложении и когда я использую rails runner? Спасибо. - person Carilda; 08.06.2012
comment
Должно. Похоже, у вас есть некоторые неправильные разрешения из-за ошибки. Я спросил версию Ruby, потому что некоторое время назад была связанная ошибка. - person Oscar Del Ben; 08.06.2012
comment
Разрешения были одной из первых вещей, которые я проверил. Групповые разрешения - rwx, а группа setgid такая же, как у моей группы. В настоящее время я пытаюсь изменить среду. - person Carilda; 08.06.2012
comment
Сценарий/рельсы имеют $SAFE=1, и когда я пытаюсь явно установить его в 0 в этом файле перед выполнением expand_path, я получаю сообщение об ошибке безопасности, говорящее, что я не могу понизить уровень безопасности. - person Carilda; 11.06.2012
comment
Я думаю, это потому, что 1 - это минимум. - person Oscar Del Ben; 11.06.2012
comment
Оскар, 0 означает отключить защиту. Консоль (для этого приложения) использует $SAFE=0. Похоже, это проблема среды, но мне все еще любопытно, какая последовательность кода заставляет .../bin/rails отображать эту ошибку. Спасибо. - person Carilda; 12.06.2012