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>