我们需要使用基于大型机的调度程序而不是 cron 来执行实用程序任务。此调度程序与主机上的代理通信,然后执行通用 setuid ksh 脚本,该脚本将实用程序与所需的任何参数一起作为参数执行。setuid ksh 脚本然后调用另一个脚本及其参数。
在我的例子中,下一个脚本 ( execute_something.ksh
) 将一些环境变量cd
s 设置为 Rails 根目录,并rails runner Module.function -e <environment>
在 environment 是传递的 arg 的位置执行。
所以那是:
mainframe -> agent -> setuid_script -> execute_something.ksh -> Module.function
当我像我自己一样直接调用时execute_something.ksh
,它工作正常。当我调用 setuid 脚本时,出现以下错误:
/[path]/bin/rails:15:in `force_encoding': 未知编码名称 - 来自 /[path]/bin/rails:15:in main 的 BINARY (ArgumentError)
这不是权限问题。所有涉及的文件要么归 setuid 用户所有,要么拥有 setgid 组的完整组权限并属于该组。(是的,矫枉过正,但这就是我得到的。)
setuid 脚本继承了我的环境(除了存在 setuid 用户的 EUID)。
此外,正在执行的 rails 脚本与安装在我的 linux 笔记本电脑上的脚本不同(我确实提到这是一个 solaris 问题)。
rails 脚本是:
#!/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 用户。
我无权更改全局环境中的内容 - 我必须提出请求并等待。没有办法改变模块必须执行的方式。
请有人 - 给我一些想法?我不认为这适用于很多人,但这不是一个有趣的谜题吗?
TIA。
卡里达