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

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

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

Так вот:

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

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

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

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

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

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

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

#!/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.

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

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

ТИА.

Carilda

1 ответ

Решение

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

./script/rails runner Module.function -e <environment> 
Другие вопросы по тегам