Мы должны использовать планировщик на основе мейнфрейма вместо cron для выполнения служебных задач. Этот планировщик связывается с агентом на хосте, который затем выполняет общий сценарий setuid ksh, который принимает в качестве аргументов утилиту для выполнения вместе с любыми требуемыми аргументами. Затем скрипт setuid ksh вызывает другой скрипт со своими аргументами.
В моем случае следующий скрипт (execute_something.ksh
) устанавливает некоторые переменные среды, cd
s в корень 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.
У меня нет прав на изменение чего-либо в глобальной среде — я должен вводить запросы и ждать. Невозможно изменить способ выполнения модуля.
Пожалуйста, кто-нибудь - дайте мне несколько идей? Я не думаю, что это относится ко многим людям, но разве это не интересная головоломка?
ТИА.
Карильда